// Generated by the protocol buffer compiler.  DO NOT EDIT!

package com.google.gwt.dev.shell.remoteui;

public final class RemoteMessageProto {
  private RemoteMessageProto() {}
  public static void registerAllExtensions(
      com.google.gwt.dev.protobuf.ExtensionRegistry registry) {
  }
  public static final class Message extends
      com.google.gwt.dev.protobuf.GeneratedMessage {
    // Use Message.newBuilder() to construct.
    private Message() {}
    
    private static final Message defaultInstance = new Message();
    public static Message getDefaultInstance() {
      return defaultInstance;
    }
    
    public Message getDefaultInstanceForType() {
      return defaultInstance;
    }
    
    public static final com.google.gwt.dev.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_descriptor;
    }
    
    protected com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_fieldAccessorTable;
    }
    
    public enum MessageType
        implements com.google.gwt.dev.protobuf.ProtocolMessageEnum {
      REQUEST(0, 0),
      RESPONSE(1, 1),
      FAILURE(2, 2),
      ;
      
      
      public final int getNumber() { return value; }
      
      public static MessageType valueOf(int value) {
        switch (value) {
          case 0: return REQUEST;
          case 1: return RESPONSE;
          case 2: return FAILURE;
          default: return null;
        }
      }
      
      public static com.google.gwt.dev.protobuf.Internal.EnumLiteMap<MessageType>
          internalGetValueMap() {
        return internalValueMap;
      }
      private static com.google.gwt.dev.protobuf.Internal.EnumLiteMap<MessageType>
          internalValueMap =
            new com.google.gwt.dev.protobuf.Internal.EnumLiteMap<MessageType>() {
              public MessageType findValueByNumber(int number) {
                return MessageType.valueOf(number)
      ;        }
            };
      
      public final com.google.gwt.dev.protobuf.Descriptors.EnumValueDescriptor
          getValueDescriptor() {
        return getDescriptor().getValues().get(index);
      }
      public final com.google.gwt.dev.protobuf.Descriptors.EnumDescriptor
          getDescriptorForType() {
        return getDescriptor();
      }
      public static final com.google.gwt.dev.protobuf.Descriptors.EnumDescriptor
          getDescriptor() {
        return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.getDescriptor().getEnumTypes().get(0);
      }
      
      private static final MessageType[] VALUES = {
        REQUEST, RESPONSE, FAILURE, 
      };
      public static MessageType valueOf(
          com.google.gwt.dev.protobuf.Descriptors.EnumValueDescriptor desc) {
        if (desc.getType() != getDescriptor()) {
          throw new java.lang.IllegalArgumentException(
            "EnumValueDescriptor is not for this type.");
        }
        return VALUES[desc.getIndex()];
      }
      private final int index;
      private final int value;
      private MessageType(int index, int value) {
        this.index = index;
        this.value = value;
      }
      
      static {
        com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
      }
    }
    
    public static final class Request extends
        com.google.gwt.dev.protobuf.GeneratedMessage {
      // Use Request.newBuilder() to construct.
      private Request() {}
      
      private static final Request defaultInstance = new Request();
      public static Request getDefaultInstance() {
        return defaultInstance;
      }
      
      public Request getDefaultInstanceForType() {
        return defaultInstance;
      }
      
      public static final com.google.gwt.dev.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_descriptor;
      }
      
      protected com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_fieldAccessorTable;
      }
      
      public enum ServiceType
          implements com.google.gwt.dev.protobuf.ProtocolMessageEnum {
        VIEWER(0, 0),
        DEV_MODE(1, 1),
        ;
        
        
        public final int getNumber() { return value; }
        
        public static ServiceType valueOf(int value) {
          switch (value) {
            case 0: return VIEWER;
            case 1: return DEV_MODE;
            default: return null;
          }
        }
        
        public static com.google.gwt.dev.protobuf.Internal.EnumLiteMap<ServiceType>
            internalGetValueMap() {
          return internalValueMap;
        }
        private static com.google.gwt.dev.protobuf.Internal.EnumLiteMap<ServiceType>
            internalValueMap =
              new com.google.gwt.dev.protobuf.Internal.EnumLiteMap<ServiceType>() {
                public ServiceType findValueByNumber(int number) {
                  return ServiceType.valueOf(number)
        ;        }
              };
        
        public final com.google.gwt.dev.protobuf.Descriptors.EnumValueDescriptor
            getValueDescriptor() {
          return getDescriptor().getValues().get(index);
        }
        public final com.google.gwt.dev.protobuf.Descriptors.EnumDescriptor
            getDescriptorForType() {
          return getDescriptor();
        }
        public static final com.google.gwt.dev.protobuf.Descriptors.EnumDescriptor
            getDescriptor() {
          return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.getDescriptor().getEnumTypes().get(0);
        }
        
        private static final ServiceType[] VALUES = {
          VIEWER, DEV_MODE, 
        };
        public static ServiceType valueOf(
            com.google.gwt.dev.protobuf.Descriptors.EnumValueDescriptor desc) {
          if (desc.getType() != getDescriptor()) {
            throw new java.lang.IllegalArgumentException(
              "EnumValueDescriptor is not for this type.");
          }
          return VALUES[desc.getIndex()];
        }
        private final int index;
        private final int value;
        private ServiceType(int index, int value) {
          this.index = index;
          this.value = value;
        }
        
        static {
          com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
        }
      }
      
      public static final class ViewerRequest extends
          com.google.gwt.dev.protobuf.GeneratedMessage {
        // Use ViewerRequest.newBuilder() to construct.
        private ViewerRequest() {}
        
        private static final ViewerRequest defaultInstance = new ViewerRequest();
        public static ViewerRequest getDefaultInstance() {
          return defaultInstance;
        }
        
        public ViewerRequest getDefaultInstanceForType() {
          return defaultInstance;
        }
        
        public static final com.google.gwt.dev.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_descriptor;
        }
        
        protected com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_fieldAccessorTable;
        }
        
        public enum RequestType
            implements com.google.gwt.dev.protobuf.ProtocolMessageEnum {
          CAPABILITY_EXCHANGE(0, 0),
          ADD_LOG(1, 1),
          ADD_LOG_BRANCH(2, 2),
          ADD_LOG_ENTRY(3, 3),
          DISCONNECT_LOG(4, 4),
          INITIALIZE(5, 5),
          ;
          
          
          public final int getNumber() { return value; }
          
          public static RequestType valueOf(int value) {
            switch (value) {
              case 0: return CAPABILITY_EXCHANGE;
              case 1: return ADD_LOG;
              case 2: return ADD_LOG_BRANCH;
              case 3: return ADD_LOG_ENTRY;
              case 4: return DISCONNECT_LOG;
              case 5: return INITIALIZE;
              default: return null;
            }
          }
          
          public static com.google.gwt.dev.protobuf.Internal.EnumLiteMap<RequestType>
              internalGetValueMap() {
            return internalValueMap;
          }
          private static com.google.gwt.dev.protobuf.Internal.EnumLiteMap<RequestType>
              internalValueMap =
                new com.google.gwt.dev.protobuf.Internal.EnumLiteMap<RequestType>() {
                  public RequestType findValueByNumber(int number) {
                    return RequestType.valueOf(number)
          ;        }
                };
          
          public final com.google.gwt.dev.protobuf.Descriptors.EnumValueDescriptor
              getValueDescriptor() {
            return getDescriptor().getValues().get(index);
          }
          public final com.google.gwt.dev.protobuf.Descriptors.EnumDescriptor
              getDescriptorForType() {
            return getDescriptor();
          }
          public static final com.google.gwt.dev.protobuf.Descriptors.EnumDescriptor
              getDescriptor() {
            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.getDescriptor().getEnumTypes().get(0);
          }
          
          private static final RequestType[] VALUES = {
            CAPABILITY_EXCHANGE, ADD_LOG, ADD_LOG_BRANCH, ADD_LOG_ENTRY, DISCONNECT_LOG, INITIALIZE, 
          };
          public static RequestType valueOf(
              com.google.gwt.dev.protobuf.Descriptors.EnumValueDescriptor desc) {
            if (desc.getType() != getDescriptor()) {
              throw new java.lang.IllegalArgumentException(
                "EnumValueDescriptor is not for this type.");
            }
            return VALUES[desc.getIndex()];
          }
          private final int index;
          private final int value;
          private RequestType(int index, int value) {
            this.index = index;
            this.value = value;
          }
          
          static {
            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
          }
        }
        
        public static final class CapabilityExchange extends
            com.google.gwt.dev.protobuf.GeneratedMessage {
          // Use CapabilityExchange.newBuilder() to construct.
          private CapabilityExchange() {}
          
          private static final CapabilityExchange defaultInstance = new CapabilityExchange();
          public static CapabilityExchange getDefaultInstance() {
            return defaultInstance;
          }
          
          public CapabilityExchange getDefaultInstanceForType() {
            return defaultInstance;
          }
          
          public static final com.google.gwt.dev.protobuf.Descriptors.Descriptor
              getDescriptor() {
            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_CapabilityExchange_descriptor;
          }
          
          protected com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
              internalGetFieldAccessorTable() {
            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_CapabilityExchange_fieldAccessorTable;
          }
          
          public final boolean isInitialized() {
            return true;
          }
          
          public void writeTo(com.google.gwt.dev.protobuf.CodedOutputStream output)
                              throws java.io.IOException {
            getUnknownFields().writeTo(output);
          }
          
          private int memoizedSerializedSize = -1;
          public int getSerializedSize() {
            int size = memoizedSerializedSize;
            if (size != -1) return size;
          
            size = 0;
            size += getUnknownFields().getSerializedSize();
            memoizedSerializedSize = size;
            return size;
          }
          
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange parseFrom(
              com.google.gwt.dev.protobuf.ByteString data)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange parseFrom(
              com.google.gwt.dev.protobuf.ByteString data,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange parseFrom(byte[] data)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange parseFrom(
              byte[] data,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange parseFrom(java.io.InputStream input)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange parseFrom(
              java.io.InputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange parseDelimitedFrom(java.io.InputStream input)
              throws java.io.IOException {
            return newBuilder().mergeDelimitedFrom(input).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange parseDelimitedFrom(
              java.io.InputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange parseFrom(
              com.google.gwt.dev.protobuf.CodedInputStream input)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange parseFrom(
              com.google.gwt.dev.protobuf.CodedInputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input, extensionRegistry)
                     .buildParsed();
          }
          
          public static Builder newBuilder() { return Builder.create(); }
          public Builder newBuilderForType() { return newBuilder(); }
          public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange prototype) {
            return newBuilder().mergeFrom(prototype);
          }
          public Builder toBuilder() { return newBuilder(this); }
          
          public static final class Builder extends
              com.google.gwt.dev.protobuf.GeneratedMessage.Builder<Builder> {
            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange result;
            
            // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange.newBuilder()
            private Builder() {}
            
            private static Builder create() {
              Builder builder = new Builder();
              builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange();
              return builder;
            }
            
            protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange internalGetResult() {
              return result;
            }
            
            public Builder clear() {
              if (result == null) {
                throw new IllegalStateException(
                  "Cannot call clear() after build().");
              }
              result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange();
              return this;
            }
            
            public Builder clone() {
              return create().mergeFrom(result);
            }
            
            public com.google.gwt.dev.protobuf.Descriptors.Descriptor
                getDescriptorForType() {
              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange.getDescriptor();
            }
            
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange getDefaultInstanceForType() {
              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange.getDefaultInstance();
            }
            
            public boolean isInitialized() {
              return result.isInitialized();
            }
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange build() {
              if (result != null && !isInitialized()) {
                throw newUninitializedMessageException(result);
              }
              return buildPartial();
            }
            
            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange buildParsed()
                throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
              if (!isInitialized()) {
                throw newUninitializedMessageException(
                  result).asInvalidProtocolBufferException();
              }
              return buildPartial();
            }
            
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange buildPartial() {
              if (result == null) {
                throw new IllegalStateException(
                  "build() has already been called on this Builder.");
              }
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange returnMe = result;
              result = null;
              return returnMe;
            }
            
            public Builder mergeFrom(com.google.gwt.dev.protobuf.Message other) {
              if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange) {
                return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange)other);
              } else {
                super.mergeFrom(other);
                return this;
              }
            }
            
            public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange other) {
              if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange.getDefaultInstance()) return this;
              this.mergeUnknownFields(other.getUnknownFields());
              return this;
            }
            
            public Builder mergeFrom(
                com.google.gwt.dev.protobuf.CodedInputStream input,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws java.io.IOException {
              com.google.gwt.dev.protobuf.UnknownFieldSet.Builder unknownFields =
                com.google.gwt.dev.protobuf.UnknownFieldSet.newBuilder(
                  this.getUnknownFields());
              while (true) {
                int tag = input.readTag();
                switch (tag) {
                  case 0:
                    this.setUnknownFields(unknownFields.build());
                    return this;
                  default: {
                    if (!parseUnknownField(input, unknownFields,
                                           extensionRegistry, tag)) {
                      this.setUnknownFields(unknownFields.build());
                      return this;
                    }
                    break;
                  }
                }
              }
            }
            
          }
          
          static {
            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
          }
          
          static {
            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
          }
        }
        
        public static final class AddLog extends
            com.google.gwt.dev.protobuf.GeneratedMessage {
          // Use AddLog.newBuilder() to construct.
          private AddLog() {}
          
          private static final AddLog defaultInstance = new AddLog();
          public static AddLog getDefaultInstance() {
            return defaultInstance;
          }
          
          public AddLog getDefaultInstanceForType() {
            return defaultInstance;
          }
          
          public static final com.google.gwt.dev.protobuf.Descriptors.Descriptor
              getDescriptor() {
            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_descriptor;
          }
          
          protected com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
              internalGetFieldAccessorTable() {
            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_fieldAccessorTable;
          }
          
          public enum LogType
              implements com.google.gwt.dev.protobuf.ProtocolMessageEnum {
            MAIN(0, 0),
            MODULE(1, 1),
            WEB_SERVER(2, 2),
            ;
            
            
            public final int getNumber() { return value; }
            
            public static LogType valueOf(int value) {
              switch (value) {
                case 0: return MAIN;
                case 1: return MODULE;
                case 2: return WEB_SERVER;
                default: return null;
              }
            }
            
            public static com.google.gwt.dev.protobuf.Internal.EnumLiteMap<LogType>
                internalGetValueMap() {
              return internalValueMap;
            }
            private static com.google.gwt.dev.protobuf.Internal.EnumLiteMap<LogType>
                internalValueMap =
                  new com.google.gwt.dev.protobuf.Internal.EnumLiteMap<LogType>() {
                    public LogType findValueByNumber(int number) {
                      return LogType.valueOf(number)
            ;        }
                  };
            
            public final com.google.gwt.dev.protobuf.Descriptors.EnumValueDescriptor
                getValueDescriptor() {
              return getDescriptor().getValues().get(index);
            }
            public final com.google.gwt.dev.protobuf.Descriptors.EnumDescriptor
                getDescriptorForType() {
              return getDescriptor();
            }
            public static final com.google.gwt.dev.protobuf.Descriptors.EnumDescriptor
                getDescriptor() {
              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.getDescriptor().getEnumTypes().get(0);
            }
            
            private static final LogType[] VALUES = {
              MAIN, MODULE, WEB_SERVER, 
            };
            public static LogType valueOf(
                com.google.gwt.dev.protobuf.Descriptors.EnumValueDescriptor desc) {
              if (desc.getType() != getDescriptor()) {
                throw new java.lang.IllegalArgumentException(
                  "EnumValueDescriptor is not for this type.");
              }
              return VALUES[desc.getIndex()];
            }
            private final int index;
            private final int value;
            private LogType(int index, int value) {
              this.index = index;
              this.value = value;
            }
            
            static {
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
            }
          }
          
          public static final class ModuleLog extends
              com.google.gwt.dev.protobuf.GeneratedMessage {
            // Use ModuleLog.newBuilder() to construct.
            private ModuleLog() {}
            
            private static final ModuleLog defaultInstance = new ModuleLog();
            public static ModuleLog getDefaultInstance() {
              return defaultInstance;
            }
            
            public ModuleLog getDefaultInstanceForType() {
              return defaultInstance;
            }
            
            public static final com.google.gwt.dev.protobuf.Descriptors.Descriptor
                getDescriptor() {
              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_ModuleLog_descriptor;
            }
            
            protected com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
                internalGetFieldAccessorTable() {
              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_ModuleLog_fieldAccessorTable;
            }
            
            // required string name = 1;
            public static final int NAME_FIELD_NUMBER = 1;
            private boolean hasName;
            private java.lang.String name_ = "";
            public boolean hasName() { return hasName; }
            public java.lang.String getName() { return name_; }
            
            // optional bytes icon = 2;
            public static final int ICON_FIELD_NUMBER = 2;
            private boolean hasIcon;
            private com.google.gwt.dev.protobuf.ByteString icon_ = com.google.gwt.dev.protobuf.ByteString.EMPTY;
            public boolean hasIcon() { return hasIcon; }
            public com.google.gwt.dev.protobuf.ByteString getIcon() { return icon_; }
            
            // optional string sessionKey = 3;
            public static final int SESSIONKEY_FIELD_NUMBER = 3;
            private boolean hasSessionKey;
            private java.lang.String sessionKey_ = "";
            public boolean hasSessionKey() { return hasSessionKey; }
            public java.lang.String getSessionKey() { return sessionKey_; }
            
            // optional string userAgent = 4;
            public static final int USERAGENT_FIELD_NUMBER = 4;
            private boolean hasUserAgent;
            private java.lang.String userAgent_ = "";
            public boolean hasUserAgent() { return hasUserAgent; }
            public java.lang.String getUserAgent() { return userAgent_; }
            
            // optional string url = 5;
            public static final int URL_FIELD_NUMBER = 5;
            private boolean hasUrl;
            private java.lang.String url_ = "";
            public boolean hasUrl() { return hasUrl; }
            public java.lang.String getUrl() { return url_; }
            
            // optional string tabKey = 6;
            public static final int TABKEY_FIELD_NUMBER = 6;
            private boolean hasTabKey;
            private java.lang.String tabKey_ = "";
            public boolean hasTabKey() { return hasTabKey; }
            public java.lang.String getTabKey() { return tabKey_; }
            
            // optional string remoteHost = 7;
            public static final int REMOTEHOST_FIELD_NUMBER = 7;
            private boolean hasRemoteHost;
            private java.lang.String remoteHost_ = "";
            public boolean hasRemoteHost() { return hasRemoteHost; }
            public java.lang.String getRemoteHost() { return remoteHost_; }
            
            public final boolean isInitialized() {
              if (!hasName) return false;
              return true;
            }
            
            public void writeTo(com.google.gwt.dev.protobuf.CodedOutputStream output)
                                throws java.io.IOException {
              if (hasName()) {
                output.writeString(1, getName());
              }
              if (hasIcon()) {
                output.writeBytes(2, getIcon());
              }
              if (hasSessionKey()) {
                output.writeString(3, getSessionKey());
              }
              if (hasUserAgent()) {
                output.writeString(4, getUserAgent());
              }
              if (hasUrl()) {
                output.writeString(5, getUrl());
              }
              if (hasTabKey()) {
                output.writeString(6, getTabKey());
              }
              if (hasRemoteHost()) {
                output.writeString(7, getRemoteHost());
              }
              getUnknownFields().writeTo(output);
            }
            
            private int memoizedSerializedSize = -1;
            public int getSerializedSize() {
              int size = memoizedSerializedSize;
              if (size != -1) return size;
            
              size = 0;
              if (hasName()) {
                size += com.google.gwt.dev.protobuf.CodedOutputStream
                  .computeStringSize(1, getName());
              }
              if (hasIcon()) {
                size += com.google.gwt.dev.protobuf.CodedOutputStream
                  .computeBytesSize(2, getIcon());
              }
              if (hasSessionKey()) {
                size += com.google.gwt.dev.protobuf.CodedOutputStream
                  .computeStringSize(3, getSessionKey());
              }
              if (hasUserAgent()) {
                size += com.google.gwt.dev.protobuf.CodedOutputStream
                  .computeStringSize(4, getUserAgent());
              }
              if (hasUrl()) {
                size += com.google.gwt.dev.protobuf.CodedOutputStream
                  .computeStringSize(5, getUrl());
              }
              if (hasTabKey()) {
                size += com.google.gwt.dev.protobuf.CodedOutputStream
                  .computeStringSize(6, getTabKey());
              }
              if (hasRemoteHost()) {
                size += com.google.gwt.dev.protobuf.CodedOutputStream
                  .computeStringSize(7, getRemoteHost());
              }
              size += getUnknownFields().getSerializedSize();
              memoizedSerializedSize = size;
              return size;
            }
            
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog parseFrom(
                com.google.gwt.dev.protobuf.ByteString data)
                throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
              return newBuilder().mergeFrom(data).buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog parseFrom(
                com.google.gwt.dev.protobuf.ByteString data,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
              return newBuilder().mergeFrom(data, extensionRegistry)
                       .buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog parseFrom(byte[] data)
                throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
              return newBuilder().mergeFrom(data).buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog parseFrom(
                byte[] data,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
              return newBuilder().mergeFrom(data, extensionRegistry)
                       .buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog parseFrom(java.io.InputStream input)
                throws java.io.IOException {
              return newBuilder().mergeFrom(input).buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog parseFrom(
                java.io.InputStream input,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws java.io.IOException {
              return newBuilder().mergeFrom(input, extensionRegistry)
                       .buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog parseDelimitedFrom(java.io.InputStream input)
                throws java.io.IOException {
              return newBuilder().mergeDelimitedFrom(input).buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog parseDelimitedFrom(
                java.io.InputStream input,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws java.io.IOException {
              return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
                       .buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog parseFrom(
                com.google.gwt.dev.protobuf.CodedInputStream input)
                throws java.io.IOException {
              return newBuilder().mergeFrom(input).buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog parseFrom(
                com.google.gwt.dev.protobuf.CodedInputStream input,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws java.io.IOException {
              return newBuilder().mergeFrom(input, extensionRegistry)
                       .buildParsed();
            }
            
            public static Builder newBuilder() { return Builder.create(); }
            public Builder newBuilderForType() { return newBuilder(); }
            public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog prototype) {
              return newBuilder().mergeFrom(prototype);
            }
            public Builder toBuilder() { return newBuilder(this); }
            
            public static final class Builder extends
                com.google.gwt.dev.protobuf.GeneratedMessage.Builder<Builder> {
              private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog result;
              
              // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog.newBuilder()
              private Builder() {}
              
              private static Builder create() {
                Builder builder = new Builder();
                builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog();
                return builder;
              }
              
              protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog internalGetResult() {
                return result;
              }
              
              public Builder clear() {
                if (result == null) {
                  throw new IllegalStateException(
                    "Cannot call clear() after build().");
                }
                result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog();
                return this;
              }
              
              public Builder clone() {
                return create().mergeFrom(result);
              }
              
              public com.google.gwt.dev.protobuf.Descriptors.Descriptor
                  getDescriptorForType() {
                return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog.getDescriptor();
              }
              
              public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog getDefaultInstanceForType() {
                return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog.getDefaultInstance();
              }
              
              public boolean isInitialized() {
                return result.isInitialized();
              }
              public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog build() {
                if (result != null && !isInitialized()) {
                  throw newUninitializedMessageException(result);
                }
                return buildPartial();
              }
              
              private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog buildParsed()
                  throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
                if (!isInitialized()) {
                  throw newUninitializedMessageException(
                    result).asInvalidProtocolBufferException();
                }
                return buildPartial();
              }
              
              public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog buildPartial() {
                if (result == null) {
                  throw new IllegalStateException(
                    "build() has already been called on this Builder.");
                }
                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog returnMe = result;
                result = null;
                return returnMe;
              }
              
              public Builder mergeFrom(com.google.gwt.dev.protobuf.Message other) {
                if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog) {
                  return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog)other);
                } else {
                  super.mergeFrom(other);
                  return this;
                }
              }
              
              public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog other) {
                if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog.getDefaultInstance()) return this;
                if (other.hasName()) {
                  setName(other.getName());
                }
                if (other.hasIcon()) {
                  setIcon(other.getIcon());
                }
                if (other.hasSessionKey()) {
                  setSessionKey(other.getSessionKey());
                }
                if (other.hasUserAgent()) {
                  setUserAgent(other.getUserAgent());
                }
                if (other.hasUrl()) {
                  setUrl(other.getUrl());
                }
                if (other.hasTabKey()) {
                  setTabKey(other.getTabKey());
                }
                if (other.hasRemoteHost()) {
                  setRemoteHost(other.getRemoteHost());
                }
                this.mergeUnknownFields(other.getUnknownFields());
                return this;
              }
              
              public Builder mergeFrom(
                  com.google.gwt.dev.protobuf.CodedInputStream input,
                  com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                  throws java.io.IOException {
                com.google.gwt.dev.protobuf.UnknownFieldSet.Builder unknownFields =
                  com.google.gwt.dev.protobuf.UnknownFieldSet.newBuilder(
                    this.getUnknownFields());
                while (true) {
                  int tag = input.readTag();
                  switch (tag) {
                    case 0:
                      this.setUnknownFields(unknownFields.build());
                      return this;
                    default: {
                      if (!parseUnknownField(input, unknownFields,
                                             extensionRegistry, tag)) {
                        this.setUnknownFields(unknownFields.build());
                        return this;
                      }
                      break;
                    }
                    case 10: {
                      setName(input.readString());
                      break;
                    }
                    case 18: {
                      setIcon(input.readBytes());
                      break;
                    }
                    case 26: {
                      setSessionKey(input.readString());
                      break;
                    }
                    case 34: {
                      setUserAgent(input.readString());
                      break;
                    }
                    case 42: {
                      setUrl(input.readString());
                      break;
                    }
                    case 50: {
                      setTabKey(input.readString());
                      break;
                    }
                    case 58: {
                      setRemoteHost(input.readString());
                      break;
                    }
                  }
                }
              }
              
              
              // required string name = 1;
              public boolean hasName() {
                return result.hasName();
              }
              public java.lang.String getName() {
                return result.getName();
              }
              public Builder setName(java.lang.String value) {
                if (value == null) {
    throw new NullPointerException();
  }
  result.hasName = true;
                result.name_ = value;
                return this;
              }
              public Builder clearName() {
                result.hasName = false;
                result.name_ = getDefaultInstance().getName();
                return this;
              }
              
              // optional bytes icon = 2;
              public boolean hasIcon() {
                return result.hasIcon();
              }
              public com.google.gwt.dev.protobuf.ByteString getIcon() {
                return result.getIcon();
              }
              public Builder setIcon(com.google.gwt.dev.protobuf.ByteString value) {
                if (value == null) {
    throw new NullPointerException();
  }
  result.hasIcon = true;
                result.icon_ = value;
                return this;
              }
              public Builder clearIcon() {
                result.hasIcon = false;
                result.icon_ = getDefaultInstance().getIcon();
                return this;
              }
              
              // optional string sessionKey = 3;
              public boolean hasSessionKey() {
                return result.hasSessionKey();
              }
              public java.lang.String getSessionKey() {
                return result.getSessionKey();
              }
              public Builder setSessionKey(java.lang.String value) {
                if (value == null) {
    throw new NullPointerException();
  }
  result.hasSessionKey = true;
                result.sessionKey_ = value;
                return this;
              }
              public Builder clearSessionKey() {
                result.hasSessionKey = false;
                result.sessionKey_ = getDefaultInstance().getSessionKey();
                return this;
              }
              
              // optional string userAgent = 4;
              public boolean hasUserAgent() {
                return result.hasUserAgent();
              }
              public java.lang.String getUserAgent() {
                return result.getUserAgent();
              }
              public Builder setUserAgent(java.lang.String value) {
                if (value == null) {
    throw new NullPointerException();
  }
  result.hasUserAgent = true;
                result.userAgent_ = value;
                return this;
              }
              public Builder clearUserAgent() {
                result.hasUserAgent = false;
                result.userAgent_ = getDefaultInstance().getUserAgent();
                return this;
              }
              
              // optional string url = 5;
              public boolean hasUrl() {
                return result.hasUrl();
              }
              public java.lang.String getUrl() {
                return result.getUrl();
              }
              public Builder setUrl(java.lang.String value) {
                if (value == null) {
    throw new NullPointerException();
  }
  result.hasUrl = true;
                result.url_ = value;
                return this;
              }
              public Builder clearUrl() {
                result.hasUrl = false;
                result.url_ = getDefaultInstance().getUrl();
                return this;
              }
              
              // optional string tabKey = 6;
              public boolean hasTabKey() {
                return result.hasTabKey();
              }
              public java.lang.String getTabKey() {
                return result.getTabKey();
              }
              public Builder setTabKey(java.lang.String value) {
                if (value == null) {
    throw new NullPointerException();
  }
  result.hasTabKey = true;
                result.tabKey_ = value;
                return this;
              }
              public Builder clearTabKey() {
                result.hasTabKey = false;
                result.tabKey_ = getDefaultInstance().getTabKey();
                return this;
              }
              
              // optional string remoteHost = 7;
              public boolean hasRemoteHost() {
                return result.hasRemoteHost();
              }
              public java.lang.String getRemoteHost() {
                return result.getRemoteHost();
              }
              public Builder setRemoteHost(java.lang.String value) {
                if (value == null) {
    throw new NullPointerException();
  }
  result.hasRemoteHost = true;
                result.remoteHost_ = value;
                return this;
              }
              public Builder clearRemoteHost() {
                result.hasRemoteHost = false;
                result.remoteHost_ = getDefaultInstance().getRemoteHost();
                return this;
              }
            }
            
            static {
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
            }
            
            static {
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
            }
          }
          
          public static final class ServerLog extends
              com.google.gwt.dev.protobuf.GeneratedMessage {
            // Use ServerLog.newBuilder() to construct.
            private ServerLog() {}
            
            private static final ServerLog defaultInstance = new ServerLog();
            public static ServerLog getDefaultInstance() {
              return defaultInstance;
            }
            
            public ServerLog getDefaultInstanceForType() {
              return defaultInstance;
            }
            
            public static final com.google.gwt.dev.protobuf.Descriptors.Descriptor
                getDescriptor() {
              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_ServerLog_descriptor;
            }
            
            protected com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
                internalGetFieldAccessorTable() {
              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_ServerLog_fieldAccessorTable;
            }
            
            // required string name = 1;
            public static final int NAME_FIELD_NUMBER = 1;
            private boolean hasName;
            private java.lang.String name_ = "";
            public boolean hasName() { return hasName; }
            public java.lang.String getName() { return name_; }
            
            // optional bytes icon = 2;
            public static final int ICON_FIELD_NUMBER = 2;
            private boolean hasIcon;
            private com.google.gwt.dev.protobuf.ByteString icon_ = com.google.gwt.dev.protobuf.ByteString.EMPTY;
            public boolean hasIcon() { return hasIcon; }
            public com.google.gwt.dev.protobuf.ByteString getIcon() { return icon_; }
            
            public final boolean isInitialized() {
              if (!hasName) return false;
              return true;
            }
            
            public void writeTo(com.google.gwt.dev.protobuf.CodedOutputStream output)
                                throws java.io.IOException {
              if (hasName()) {
                output.writeString(1, getName());
              }
              if (hasIcon()) {
                output.writeBytes(2, getIcon());
              }
              getUnknownFields().writeTo(output);
            }
            
            private int memoizedSerializedSize = -1;
            public int getSerializedSize() {
              int size = memoizedSerializedSize;
              if (size != -1) return size;
            
              size = 0;
              if (hasName()) {
                size += com.google.gwt.dev.protobuf.CodedOutputStream
                  .computeStringSize(1, getName());
              }
              if (hasIcon()) {
                size += com.google.gwt.dev.protobuf.CodedOutputStream
                  .computeBytesSize(2, getIcon());
              }
              size += getUnknownFields().getSerializedSize();
              memoizedSerializedSize = size;
              return size;
            }
            
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog parseFrom(
                com.google.gwt.dev.protobuf.ByteString data)
                throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
              return newBuilder().mergeFrom(data).buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog parseFrom(
                com.google.gwt.dev.protobuf.ByteString data,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
              return newBuilder().mergeFrom(data, extensionRegistry)
                       .buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog parseFrom(byte[] data)
                throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
              return newBuilder().mergeFrom(data).buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog parseFrom(
                byte[] data,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
              return newBuilder().mergeFrom(data, extensionRegistry)
                       .buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog parseFrom(java.io.InputStream input)
                throws java.io.IOException {
              return newBuilder().mergeFrom(input).buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog parseFrom(
                java.io.InputStream input,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws java.io.IOException {
              return newBuilder().mergeFrom(input, extensionRegistry)
                       .buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog parseDelimitedFrom(java.io.InputStream input)
                throws java.io.IOException {
              return newBuilder().mergeDelimitedFrom(input).buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog parseDelimitedFrom(
                java.io.InputStream input,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws java.io.IOException {
              return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
                       .buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog parseFrom(
                com.google.gwt.dev.protobuf.CodedInputStream input)
                throws java.io.IOException {
              return newBuilder().mergeFrom(input).buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog parseFrom(
                com.google.gwt.dev.protobuf.CodedInputStream input,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws java.io.IOException {
              return newBuilder().mergeFrom(input, extensionRegistry)
                       .buildParsed();
            }
            
            public static Builder newBuilder() { return Builder.create(); }
            public Builder newBuilderForType() { return newBuilder(); }
            public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog prototype) {
              return newBuilder().mergeFrom(prototype);
            }
            public Builder toBuilder() { return newBuilder(this); }
            
            public static final class Builder extends
                com.google.gwt.dev.protobuf.GeneratedMessage.Builder<Builder> {
              private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog result;
              
              // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog.newBuilder()
              private Builder() {}
              
              private static Builder create() {
                Builder builder = new Builder();
                builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog();
                return builder;
              }
              
              protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog internalGetResult() {
                return result;
              }
              
              public Builder clear() {
                if (result == null) {
                  throw new IllegalStateException(
                    "Cannot call clear() after build().");
                }
                result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog();
                return this;
              }
              
              public Builder clone() {
                return create().mergeFrom(result);
              }
              
              public com.google.gwt.dev.protobuf.Descriptors.Descriptor
                  getDescriptorForType() {
                return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog.getDescriptor();
              }
              
              public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog getDefaultInstanceForType() {
                return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog.getDefaultInstance();
              }
              
              public boolean isInitialized() {
                return result.isInitialized();
              }
              public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog build() {
                if (result != null && !isInitialized()) {
                  throw newUninitializedMessageException(result);
                }
                return buildPartial();
              }
              
              private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog buildParsed()
                  throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
                if (!isInitialized()) {
                  throw newUninitializedMessageException(
                    result).asInvalidProtocolBufferException();
                }
                return buildPartial();
              }
              
              public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog buildPartial() {
                if (result == null) {
                  throw new IllegalStateException(
                    "build() has already been called on this Builder.");
                }
                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog returnMe = result;
                result = null;
                return returnMe;
              }
              
              public Builder mergeFrom(com.google.gwt.dev.protobuf.Message other) {
                if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog) {
                  return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog)other);
                } else {
                  super.mergeFrom(other);
                  return this;
                }
              }
              
              public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog other) {
                if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog.getDefaultInstance()) return this;
                if (other.hasName()) {
                  setName(other.getName());
                }
                if (other.hasIcon()) {
                  setIcon(other.getIcon());
                }
                this.mergeUnknownFields(other.getUnknownFields());
                return this;
              }
              
              public Builder mergeFrom(
                  com.google.gwt.dev.protobuf.CodedInputStream input,
                  com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                  throws java.io.IOException {
                com.google.gwt.dev.protobuf.UnknownFieldSet.Builder unknownFields =
                  com.google.gwt.dev.protobuf.UnknownFieldSet.newBuilder(
                    this.getUnknownFields());
                while (true) {
                  int tag = input.readTag();
                  switch (tag) {
                    case 0:
                      this.setUnknownFields(unknownFields.build());
                      return this;
                    default: {
                      if (!parseUnknownField(input, unknownFields,
                                             extensionRegistry, tag)) {
                        this.setUnknownFields(unknownFields.build());
                        return this;
                      }
                      break;
                    }
                    case 10: {
                      setName(input.readString());
                      break;
                    }
                    case 18: {
                      setIcon(input.readBytes());
                      break;
                    }
                  }
                }
              }
              
              
              // required string name = 1;
              public boolean hasName() {
                return result.hasName();
              }
              public java.lang.String getName() {
                return result.getName();
              }
              public Builder setName(java.lang.String value) {
                if (value == null) {
    throw new NullPointerException();
  }
  result.hasName = true;
                result.name_ = value;
                return this;
              }
              public Builder clearName() {
                result.hasName = false;
                result.name_ = getDefaultInstance().getName();
                return this;
              }
              
              // optional bytes icon = 2;
              public boolean hasIcon() {
                return result.hasIcon();
              }
              public com.google.gwt.dev.protobuf.ByteString getIcon() {
                return result.getIcon();
              }
              public Builder setIcon(com.google.gwt.dev.protobuf.ByteString value) {
                if (value == null) {
    throw new NullPointerException();
  }
  result.hasIcon = true;
                result.icon_ = value;
                return this;
              }
              public Builder clearIcon() {
                result.hasIcon = false;
                result.icon_ = getDefaultInstance().getIcon();
                return this;
              }
            }
            
            static {
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
            }
            
            static {
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
            }
          }
          
          public static final class MainLog extends
              com.google.gwt.dev.protobuf.GeneratedMessage {
            // Use MainLog.newBuilder() to construct.
            private MainLog() {}
            
            private static final MainLog defaultInstance = new MainLog();
            public static MainLog getDefaultInstance() {
              return defaultInstance;
            }
            
            public MainLog getDefaultInstanceForType() {
              return defaultInstance;
            }
            
            public static final com.google.gwt.dev.protobuf.Descriptors.Descriptor
                getDescriptor() {
              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_MainLog_descriptor;
            }
            
            protected com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
                internalGetFieldAccessorTable() {
              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_MainLog_fieldAccessorTable;
            }
            
            public final boolean isInitialized() {
              return true;
            }
            
            public void writeTo(com.google.gwt.dev.protobuf.CodedOutputStream output)
                                throws java.io.IOException {
              getUnknownFields().writeTo(output);
            }
            
            private int memoizedSerializedSize = -1;
            public int getSerializedSize() {
              int size = memoizedSerializedSize;
              if (size != -1) return size;
            
              size = 0;
              size += getUnknownFields().getSerializedSize();
              memoizedSerializedSize = size;
              return size;
            }
            
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog parseFrom(
                com.google.gwt.dev.protobuf.ByteString data)
                throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
              return newBuilder().mergeFrom(data).buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog parseFrom(
                com.google.gwt.dev.protobuf.ByteString data,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
              return newBuilder().mergeFrom(data, extensionRegistry)
                       .buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog parseFrom(byte[] data)
                throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
              return newBuilder().mergeFrom(data).buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog parseFrom(
                byte[] data,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
              return newBuilder().mergeFrom(data, extensionRegistry)
                       .buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog parseFrom(java.io.InputStream input)
                throws java.io.IOException {
              return newBuilder().mergeFrom(input).buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog parseFrom(
                java.io.InputStream input,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws java.io.IOException {
              return newBuilder().mergeFrom(input, extensionRegistry)
                       .buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog parseDelimitedFrom(java.io.InputStream input)
                throws java.io.IOException {
              return newBuilder().mergeDelimitedFrom(input).buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog parseDelimitedFrom(
                java.io.InputStream input,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws java.io.IOException {
              return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
                       .buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog parseFrom(
                com.google.gwt.dev.protobuf.CodedInputStream input)
                throws java.io.IOException {
              return newBuilder().mergeFrom(input).buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog parseFrom(
                com.google.gwt.dev.protobuf.CodedInputStream input,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws java.io.IOException {
              return newBuilder().mergeFrom(input, extensionRegistry)
                       .buildParsed();
            }
            
            public static Builder newBuilder() { return Builder.create(); }
            public Builder newBuilderForType() { return newBuilder(); }
            public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog prototype) {
              return newBuilder().mergeFrom(prototype);
            }
            public Builder toBuilder() { return newBuilder(this); }
            
            public static final class Builder extends
                com.google.gwt.dev.protobuf.GeneratedMessage.Builder<Builder> {
              private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog result;
              
              // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog.newBuilder()
              private Builder() {}
              
              private static Builder create() {
                Builder builder = new Builder();
                builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog();
                return builder;
              }
              
              protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog internalGetResult() {
                return result;
              }
              
              public Builder clear() {
                if (result == null) {
                  throw new IllegalStateException(
                    "Cannot call clear() after build().");
                }
                result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog();
                return this;
              }
              
              public Builder clone() {
                return create().mergeFrom(result);
              }
              
              public com.google.gwt.dev.protobuf.Descriptors.Descriptor
                  getDescriptorForType() {
                return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog.getDescriptor();
              }
              
              public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog getDefaultInstanceForType() {
                return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog.getDefaultInstance();
              }
              
              public boolean isInitialized() {
                return result.isInitialized();
              }
              public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog build() {
                if (result != null && !isInitialized()) {
                  throw newUninitializedMessageException(result);
                }
                return buildPartial();
              }
              
              private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog buildParsed()
                  throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
                if (!isInitialized()) {
                  throw newUninitializedMessageException(
                    result).asInvalidProtocolBufferException();
                }
                return buildPartial();
              }
              
              public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog buildPartial() {
                if (result == null) {
                  throw new IllegalStateException(
                    "build() has already been called on this Builder.");
                }
                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog returnMe = result;
                result = null;
                return returnMe;
              }
              
              public Builder mergeFrom(com.google.gwt.dev.protobuf.Message other) {
                if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog) {
                  return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog)other);
                } else {
                  super.mergeFrom(other);
                  return this;
                }
              }
              
              public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog other) {
                if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog.getDefaultInstance()) return this;
                this.mergeUnknownFields(other.getUnknownFields());
                return this;
              }
              
              public Builder mergeFrom(
                  com.google.gwt.dev.protobuf.CodedInputStream input,
                  com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                  throws java.io.IOException {
                com.google.gwt.dev.protobuf.UnknownFieldSet.Builder unknownFields =
                  com.google.gwt.dev.protobuf.UnknownFieldSet.newBuilder(
                    this.getUnknownFields());
                while (true) {
                  int tag = input.readTag();
                  switch (tag) {
                    case 0:
                      this.setUnknownFields(unknownFields.build());
                      return this;
                    default: {
                      if (!parseUnknownField(input, unknownFields,
                                             extensionRegistry, tag)) {
                        this.setUnknownFields(unknownFields.build());
                        return this;
                      }
                      break;
                    }
                  }
                }
              }
              
            }
            
            static {
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
            }
            
            static {
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
            }
          }
          
          // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.AddLog.LogType type = 1;
          public static final int TYPE_FIELD_NUMBER = 1;
          private boolean hasType;
          private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.LogType type_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.LogType.MAIN;
          public boolean hasType() { return hasType; }
          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.LogType getType() { return type_; }
          
          // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.AddLog.ModuleLog moduleLog = 2;
          public static final int MODULELOG_FIELD_NUMBER = 2;
          private boolean hasModuleLog;
          private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog moduleLog_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog.getDefaultInstance();
          public boolean hasModuleLog() { return hasModuleLog; }
          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog getModuleLog() { return moduleLog_; }
          
          // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.AddLog.ServerLog serverLog = 3;
          public static final int SERVERLOG_FIELD_NUMBER = 3;
          private boolean hasServerLog;
          private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog serverLog_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog.getDefaultInstance();
          public boolean hasServerLog() { return hasServerLog; }
          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog getServerLog() { return serverLog_; }
          
          // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.AddLog.MainLog mainLog = 4;
          public static final int MAINLOG_FIELD_NUMBER = 4;
          private boolean hasMainLog;
          private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog mainLog_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog.getDefaultInstance();
          public boolean hasMainLog() { return hasMainLog; }
          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog getMainLog() { return mainLog_; }
          
          public final boolean isInitialized() {
            if (hasModuleLog()) {
              if (!getModuleLog().isInitialized()) return false;
            }
            if (hasServerLog()) {
              if (!getServerLog().isInitialized()) return false;
            }
            return true;
          }
          
          public void writeTo(com.google.gwt.dev.protobuf.CodedOutputStream output)
                              throws java.io.IOException {
            if (hasType()) {
              output.writeEnum(1, getType().getNumber());
            }
            if (hasModuleLog()) {
              output.writeMessage(2, getModuleLog());
            }
            if (hasServerLog()) {
              output.writeMessage(3, getServerLog());
            }
            if (hasMainLog()) {
              output.writeMessage(4, getMainLog());
            }
            getUnknownFields().writeTo(output);
          }
          
          private int memoizedSerializedSize = -1;
          public int getSerializedSize() {
            int size = memoizedSerializedSize;
            if (size != -1) return size;
          
            size = 0;
            if (hasType()) {
              size += com.google.gwt.dev.protobuf.CodedOutputStream
                .computeEnumSize(1, getType().getNumber());
            }
            if (hasModuleLog()) {
              size += com.google.gwt.dev.protobuf.CodedOutputStream
                .computeMessageSize(2, getModuleLog());
            }
            if (hasServerLog()) {
              size += com.google.gwt.dev.protobuf.CodedOutputStream
                .computeMessageSize(3, getServerLog());
            }
            if (hasMainLog()) {
              size += com.google.gwt.dev.protobuf.CodedOutputStream
                .computeMessageSize(4, getMainLog());
            }
            size += getUnknownFields().getSerializedSize();
            memoizedSerializedSize = size;
            return size;
          }
          
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog parseFrom(
              com.google.gwt.dev.protobuf.ByteString data)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog parseFrom(
              com.google.gwt.dev.protobuf.ByteString data,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog parseFrom(byte[] data)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog parseFrom(
              byte[] data,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog parseFrom(java.io.InputStream input)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog parseFrom(
              java.io.InputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog parseDelimitedFrom(java.io.InputStream input)
              throws java.io.IOException {
            return newBuilder().mergeDelimitedFrom(input).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog parseDelimitedFrom(
              java.io.InputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog parseFrom(
              com.google.gwt.dev.protobuf.CodedInputStream input)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog parseFrom(
              com.google.gwt.dev.protobuf.CodedInputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input, extensionRegistry)
                     .buildParsed();
          }
          
          public static Builder newBuilder() { return Builder.create(); }
          public Builder newBuilderForType() { return newBuilder(); }
          public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog prototype) {
            return newBuilder().mergeFrom(prototype);
          }
          public Builder toBuilder() { return newBuilder(this); }
          
          public static final class Builder extends
              com.google.gwt.dev.protobuf.GeneratedMessage.Builder<Builder> {
            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog result;
            
            // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.newBuilder()
            private Builder() {}
            
            private static Builder create() {
              Builder builder = new Builder();
              builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog();
              return builder;
            }
            
            protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog internalGetResult() {
              return result;
            }
            
            public Builder clear() {
              if (result == null) {
                throw new IllegalStateException(
                  "Cannot call clear() after build().");
              }
              result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog();
              return this;
            }
            
            public Builder clone() {
              return create().mergeFrom(result);
            }
            
            public com.google.gwt.dev.protobuf.Descriptors.Descriptor
                getDescriptorForType() {
              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.getDescriptor();
            }
            
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog getDefaultInstanceForType() {
              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.getDefaultInstance();
            }
            
            public boolean isInitialized() {
              return result.isInitialized();
            }
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog build() {
              if (result != null && !isInitialized()) {
                throw newUninitializedMessageException(result);
              }
              return buildPartial();
            }
            
            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog buildParsed()
                throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
              if (!isInitialized()) {
                throw newUninitializedMessageException(
                  result).asInvalidProtocolBufferException();
              }
              return buildPartial();
            }
            
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog buildPartial() {
              if (result == null) {
                throw new IllegalStateException(
                  "build() has already been called on this Builder.");
              }
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog returnMe = result;
              result = null;
              return returnMe;
            }
            
            public Builder mergeFrom(com.google.gwt.dev.protobuf.Message other) {
              if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog) {
                return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog)other);
              } else {
                super.mergeFrom(other);
                return this;
              }
            }
            
            public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog other) {
              if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.getDefaultInstance()) return this;
              if (other.hasType()) {
                setType(other.getType());
              }
              if (other.hasModuleLog()) {
                mergeModuleLog(other.getModuleLog());
              }
              if (other.hasServerLog()) {
                mergeServerLog(other.getServerLog());
              }
              if (other.hasMainLog()) {
                mergeMainLog(other.getMainLog());
              }
              this.mergeUnknownFields(other.getUnknownFields());
              return this;
            }
            
            public Builder mergeFrom(
                com.google.gwt.dev.protobuf.CodedInputStream input,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws java.io.IOException {
              com.google.gwt.dev.protobuf.UnknownFieldSet.Builder unknownFields =
                com.google.gwt.dev.protobuf.UnknownFieldSet.newBuilder(
                  this.getUnknownFields());
              while (true) {
                int tag = input.readTag();
                switch (tag) {
                  case 0:
                    this.setUnknownFields(unknownFields.build());
                    return this;
                  default: {
                    if (!parseUnknownField(input, unknownFields,
                                           extensionRegistry, tag)) {
                      this.setUnknownFields(unknownFields.build());
                      return this;
                    }
                    break;
                  }
                  case 8: {
                    int rawValue = input.readEnum();
                    com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.LogType value = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.LogType.valueOf(rawValue);
                    if (value == null) {
                      unknownFields.mergeVarintField(1, rawValue);
                    } else {
                      setType(value);
                    }
                    break;
                  }
                  case 18: {
                    com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog.newBuilder();
                    if (hasModuleLog()) {
                      subBuilder.mergeFrom(getModuleLog());
                    }
                    input.readMessage(subBuilder, extensionRegistry);
                    setModuleLog(subBuilder.buildPartial());
                    break;
                  }
                  case 26: {
                    com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog.newBuilder();
                    if (hasServerLog()) {
                      subBuilder.mergeFrom(getServerLog());
                    }
                    input.readMessage(subBuilder, extensionRegistry);
                    setServerLog(subBuilder.buildPartial());
                    break;
                  }
                  case 34: {
                    com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog.newBuilder();
                    if (hasMainLog()) {
                      subBuilder.mergeFrom(getMainLog());
                    }
                    input.readMessage(subBuilder, extensionRegistry);
                    setMainLog(subBuilder.buildPartial());
                    break;
                  }
                }
              }
            }
            
            
            // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.AddLog.LogType type = 1;
            public boolean hasType() {
              return result.hasType();
            }
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.LogType getType() {
              return result.getType();
            }
            public Builder setType(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.LogType value) {
              if (value == null) {
                throw new NullPointerException();
              }
              result.hasType = true;
              result.type_ = value;
              return this;
            }
            public Builder clearType() {
              result.hasType = false;
              result.type_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.LogType.MAIN;
              return this;
            }
            
            // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.AddLog.ModuleLog moduleLog = 2;
            public boolean hasModuleLog() {
              return result.hasModuleLog();
            }
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog getModuleLog() {
              return result.getModuleLog();
            }
            public Builder setModuleLog(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog value) {
              if (value == null) {
                throw new NullPointerException();
              }
              result.hasModuleLog = true;
              result.moduleLog_ = value;
              return this;
            }
            public Builder setModuleLog(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog.Builder builderForValue) {
              result.hasModuleLog = true;
              result.moduleLog_ = builderForValue.build();
              return this;
            }
            public Builder mergeModuleLog(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog value) {
              if (result.hasModuleLog() &&
                  result.moduleLog_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog.getDefaultInstance()) {
                result.moduleLog_ =
                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog.newBuilder(result.moduleLog_).mergeFrom(value).buildPartial();
              } else {
                result.moduleLog_ = value;
              }
              result.hasModuleLog = true;
              return this;
            }
            public Builder clearModuleLog() {
              result.hasModuleLog = false;
              result.moduleLog_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog.getDefaultInstance();
              return this;
            }
            
            // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.AddLog.ServerLog serverLog = 3;
            public boolean hasServerLog() {
              return result.hasServerLog();
            }
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog getServerLog() {
              return result.getServerLog();
            }
            public Builder setServerLog(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog value) {
              if (value == null) {
                throw new NullPointerException();
              }
              result.hasServerLog = true;
              result.serverLog_ = value;
              return this;
            }
            public Builder setServerLog(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog.Builder builderForValue) {
              result.hasServerLog = true;
              result.serverLog_ = builderForValue.build();
              return this;
            }
            public Builder mergeServerLog(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog value) {
              if (result.hasServerLog() &&
                  result.serverLog_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog.getDefaultInstance()) {
                result.serverLog_ =
                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog.newBuilder(result.serverLog_).mergeFrom(value).buildPartial();
              } else {
                result.serverLog_ = value;
              }
              result.hasServerLog = true;
              return this;
            }
            public Builder clearServerLog() {
              result.hasServerLog = false;
              result.serverLog_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog.getDefaultInstance();
              return this;
            }
            
            // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.AddLog.MainLog mainLog = 4;
            public boolean hasMainLog() {
              return result.hasMainLog();
            }
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog getMainLog() {
              return result.getMainLog();
            }
            public Builder setMainLog(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog value) {
              if (value == null) {
                throw new NullPointerException();
              }
              result.hasMainLog = true;
              result.mainLog_ = value;
              return this;
            }
            public Builder setMainLog(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog.Builder builderForValue) {
              result.hasMainLog = true;
              result.mainLog_ = builderForValue.build();
              return this;
            }
            public Builder mergeMainLog(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog value) {
              if (result.hasMainLog() &&
                  result.mainLog_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog.getDefaultInstance()) {
                result.mainLog_ =
                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog.newBuilder(result.mainLog_).mergeFrom(value).buildPartial();
              } else {
                result.mainLog_ = value;
              }
              result.hasMainLog = true;
              return this;
            }
            public Builder clearMainLog() {
              result.hasMainLog = false;
              result.mainLog_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog.getDefaultInstance();
              return this;
            }
          }
          
          static {
            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
          }
          
          static {
            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
          }
        }
        
        public static final class LogData extends
            com.google.gwt.dev.protobuf.GeneratedMessage {
          // Use LogData.newBuilder() to construct.
          private LogData() {}
          
          private static final LogData defaultInstance = new LogData();
          public static LogData getDefaultInstance() {
            return defaultInstance;
          }
          
          public LogData getDefaultInstanceForType() {
            return defaultInstance;
          }
          
          public static final com.google.gwt.dev.protobuf.Descriptors.Descriptor
              getDescriptor() {
            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_LogData_descriptor;
          }
          
          protected com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
              internalGetFieldAccessorTable() {
            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_LogData_fieldAccessorTable;
          }
          
          public static final class HelpInfo extends
              com.google.gwt.dev.protobuf.GeneratedMessage {
            // Use HelpInfo.newBuilder() to construct.
            private HelpInfo() {}
            
            private static final HelpInfo defaultInstance = new HelpInfo();
            public static HelpInfo getDefaultInstance() {
              return defaultInstance;
            }
            
            public HelpInfo getDefaultInstanceForType() {
              return defaultInstance;
            }
            
            public static final com.google.gwt.dev.protobuf.Descriptors.Descriptor
                getDescriptor() {
              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_LogData_HelpInfo_descriptor;
            }
            
            protected com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
                internalGetFieldAccessorTable() {
              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_LogData_HelpInfo_fieldAccessorTable;
            }
            
            // optional string url = 1;
            public static final int URL_FIELD_NUMBER = 1;
            private boolean hasUrl;
            private java.lang.String url_ = "";
            public boolean hasUrl() { return hasUrl; }
            public java.lang.String getUrl() { return url_; }
            
            // optional string text = 2;
            public static final int TEXT_FIELD_NUMBER = 2;
            private boolean hasText;
            private java.lang.String text_ = "";
            public boolean hasText() { return hasText; }
            public java.lang.String getText() { return text_; }
            
            public final boolean isInitialized() {
              return true;
            }
            
            public void writeTo(com.google.gwt.dev.protobuf.CodedOutputStream output)
                                throws java.io.IOException {
              if (hasUrl()) {
                output.writeString(1, getUrl());
              }
              if (hasText()) {
                output.writeString(2, getText());
              }
              getUnknownFields().writeTo(output);
            }
            
            private int memoizedSerializedSize = -1;
            public int getSerializedSize() {
              int size = memoizedSerializedSize;
              if (size != -1) return size;
            
              size = 0;
              if (hasUrl()) {
                size += com.google.gwt.dev.protobuf.CodedOutputStream
                  .computeStringSize(1, getUrl());
              }
              if (hasText()) {
                size += com.google.gwt.dev.protobuf.CodedOutputStream
                  .computeStringSize(2, getText());
              }
              size += getUnknownFields().getSerializedSize();
              memoizedSerializedSize = size;
              return size;
            }
            
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo parseFrom(
                com.google.gwt.dev.protobuf.ByteString data)
                throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
              return newBuilder().mergeFrom(data).buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo parseFrom(
                com.google.gwt.dev.protobuf.ByteString data,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
              return newBuilder().mergeFrom(data, extensionRegistry)
                       .buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo parseFrom(byte[] data)
                throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
              return newBuilder().mergeFrom(data).buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo parseFrom(
                byte[] data,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
              return newBuilder().mergeFrom(data, extensionRegistry)
                       .buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo parseFrom(java.io.InputStream input)
                throws java.io.IOException {
              return newBuilder().mergeFrom(input).buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo parseFrom(
                java.io.InputStream input,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws java.io.IOException {
              return newBuilder().mergeFrom(input, extensionRegistry)
                       .buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo parseDelimitedFrom(java.io.InputStream input)
                throws java.io.IOException {
              return newBuilder().mergeDelimitedFrom(input).buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo parseDelimitedFrom(
                java.io.InputStream input,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws java.io.IOException {
              return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
                       .buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo parseFrom(
                com.google.gwt.dev.protobuf.CodedInputStream input)
                throws java.io.IOException {
              return newBuilder().mergeFrom(input).buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo parseFrom(
                com.google.gwt.dev.protobuf.CodedInputStream input,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws java.io.IOException {
              return newBuilder().mergeFrom(input, extensionRegistry)
                       .buildParsed();
            }
            
            public static Builder newBuilder() { return Builder.create(); }
            public Builder newBuilderForType() { return newBuilder(); }
            public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo prototype) {
              return newBuilder().mergeFrom(prototype);
            }
            public Builder toBuilder() { return newBuilder(this); }
            
            public static final class Builder extends
                com.google.gwt.dev.protobuf.GeneratedMessage.Builder<Builder> {
              private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo result;
              
              // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo.newBuilder()
              private Builder() {}
              
              private static Builder create() {
                Builder builder = new Builder();
                builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo();
                return builder;
              }
              
              protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo internalGetResult() {
                return result;
              }
              
              public Builder clear() {
                if (result == null) {
                  throw new IllegalStateException(
                    "Cannot call clear() after build().");
                }
                result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo();
                return this;
              }
              
              public Builder clone() {
                return create().mergeFrom(result);
              }
              
              public com.google.gwt.dev.protobuf.Descriptors.Descriptor
                  getDescriptorForType() {
                return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo.getDescriptor();
              }
              
              public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo getDefaultInstanceForType() {
                return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo.getDefaultInstance();
              }
              
              public boolean isInitialized() {
                return result.isInitialized();
              }
              public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo build() {
                if (result != null && !isInitialized()) {
                  throw newUninitializedMessageException(result);
                }
                return buildPartial();
              }
              
              private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo buildParsed()
                  throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
                if (!isInitialized()) {
                  throw newUninitializedMessageException(
                    result).asInvalidProtocolBufferException();
                }
                return buildPartial();
              }
              
              public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo buildPartial() {
                if (result == null) {
                  throw new IllegalStateException(
                    "build() has already been called on this Builder.");
                }
                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo returnMe = result;
                result = null;
                return returnMe;
              }
              
              public Builder mergeFrom(com.google.gwt.dev.protobuf.Message other) {
                if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo) {
                  return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo)other);
                } else {
                  super.mergeFrom(other);
                  return this;
                }
              }
              
              public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo other) {
                if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo.getDefaultInstance()) return this;
                if (other.hasUrl()) {
                  setUrl(other.getUrl());
                }
                if (other.hasText()) {
                  setText(other.getText());
                }
                this.mergeUnknownFields(other.getUnknownFields());
                return this;
              }
              
              public Builder mergeFrom(
                  com.google.gwt.dev.protobuf.CodedInputStream input,
                  com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                  throws java.io.IOException {
                com.google.gwt.dev.protobuf.UnknownFieldSet.Builder unknownFields =
                  com.google.gwt.dev.protobuf.UnknownFieldSet.newBuilder(
                    this.getUnknownFields());
                while (true) {
                  int tag = input.readTag();
                  switch (tag) {
                    case 0:
                      this.setUnknownFields(unknownFields.build());
                      return this;
                    default: {
                      if (!parseUnknownField(input, unknownFields,
                                             extensionRegistry, tag)) {
                        this.setUnknownFields(unknownFields.build());
                        return this;
                      }
                      break;
                    }
                    case 10: {
                      setUrl(input.readString());
                      break;
                    }
                    case 18: {
                      setText(input.readString());
                      break;
                    }
                  }
                }
              }
              
              
              // optional string url = 1;
              public boolean hasUrl() {
                return result.hasUrl();
              }
              public java.lang.String getUrl() {
                return result.getUrl();
              }
              public Builder setUrl(java.lang.String value) {
                if (value == null) {
    throw new NullPointerException();
  }
  result.hasUrl = true;
                result.url_ = value;
                return this;
              }
              public Builder clearUrl() {
                result.hasUrl = false;
                result.url_ = getDefaultInstance().getUrl();
                return this;
              }
              
              // optional string text = 2;
              public boolean hasText() {
                return result.hasText();
              }
              public java.lang.String getText() {
                return result.getText();
              }
              public Builder setText(java.lang.String value) {
                if (value == null) {
    throw new NullPointerException();
  }
  result.hasText = true;
                result.text_ = value;
                return this;
              }
              public Builder clearText() {
                result.hasText = false;
                result.text_ = getDefaultInstance().getText();
                return this;
              }
            }
            
            static {
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
            }
            
            static {
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
            }
          }
          
          // required string summary = 1;
          public static final int SUMMARY_FIELD_NUMBER = 1;
          private boolean hasSummary;
          private java.lang.String summary_ = "";
          public boolean hasSummary() { return hasSummary; }
          public java.lang.String getSummary() { return summary_; }
          
          // optional string level = 2;
          public static final int LEVEL_FIELD_NUMBER = 2;
          private boolean hasLevel;
          private java.lang.String level_ = "";
          public boolean hasLevel() { return hasLevel; }
          public java.lang.String getLevel() { return level_; }
          
          // optional bool needsAttention = 3;
          public static final int NEEDSATTENTION_FIELD_NUMBER = 3;
          private boolean hasNeedsAttention;
          private boolean needsAttention_ = false;
          public boolean hasNeedsAttention() { return hasNeedsAttention; }
          public boolean getNeedsAttention() { return needsAttention_; }
          
          // optional string details = 4;
          public static final int DETAILS_FIELD_NUMBER = 4;
          private boolean hasDetails;
          private java.lang.String details_ = "";
          public boolean hasDetails() { return hasDetails; }
          public java.lang.String getDetails() { return details_; }
          
          // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.LogData.HelpInfo helpInfo = 5;
          public static final int HELPINFO_FIELD_NUMBER = 5;
          private boolean hasHelpInfo;
          private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo helpInfo_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo.getDefaultInstance();
          public boolean hasHelpInfo() { return hasHelpInfo; }
          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo getHelpInfo() { return helpInfo_; }
          
          public final boolean isInitialized() {
            if (!hasSummary) return false;
            return true;
          }
          
          public void writeTo(com.google.gwt.dev.protobuf.CodedOutputStream output)
                              throws java.io.IOException {
            if (hasSummary()) {
              output.writeString(1, getSummary());
            }
            if (hasLevel()) {
              output.writeString(2, getLevel());
            }
            if (hasNeedsAttention()) {
              output.writeBool(3, getNeedsAttention());
            }
            if (hasDetails()) {
              output.writeString(4, getDetails());
            }
            if (hasHelpInfo()) {
              output.writeMessage(5, getHelpInfo());
            }
            getUnknownFields().writeTo(output);
          }
          
          private int memoizedSerializedSize = -1;
          public int getSerializedSize() {
            int size = memoizedSerializedSize;
            if (size != -1) return size;
          
            size = 0;
            if (hasSummary()) {
              size += com.google.gwt.dev.protobuf.CodedOutputStream
                .computeStringSize(1, getSummary());
            }
            if (hasLevel()) {
              size += com.google.gwt.dev.protobuf.CodedOutputStream
                .computeStringSize(2, getLevel());
            }
            if (hasNeedsAttention()) {
              size += com.google.gwt.dev.protobuf.CodedOutputStream
                .computeBoolSize(3, getNeedsAttention());
            }
            if (hasDetails()) {
              size += com.google.gwt.dev.protobuf.CodedOutputStream
                .computeStringSize(4, getDetails());
            }
            if (hasHelpInfo()) {
              size += com.google.gwt.dev.protobuf.CodedOutputStream
                .computeMessageSize(5, getHelpInfo());
            }
            size += getUnknownFields().getSerializedSize();
            memoizedSerializedSize = size;
            return size;
          }
          
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData parseFrom(
              com.google.gwt.dev.protobuf.ByteString data)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData parseFrom(
              com.google.gwt.dev.protobuf.ByteString data,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData parseFrom(byte[] data)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData parseFrom(
              byte[] data,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData parseFrom(java.io.InputStream input)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData parseFrom(
              java.io.InputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData parseDelimitedFrom(java.io.InputStream input)
              throws java.io.IOException {
            return newBuilder().mergeDelimitedFrom(input).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData parseDelimitedFrom(
              java.io.InputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData parseFrom(
              com.google.gwt.dev.protobuf.CodedInputStream input)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData parseFrom(
              com.google.gwt.dev.protobuf.CodedInputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input, extensionRegistry)
                     .buildParsed();
          }
          
          public static Builder newBuilder() { return Builder.create(); }
          public Builder newBuilderForType() { return newBuilder(); }
          public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData prototype) {
            return newBuilder().mergeFrom(prototype);
          }
          public Builder toBuilder() { return newBuilder(this); }
          
          public static final class Builder extends
              com.google.gwt.dev.protobuf.GeneratedMessage.Builder<Builder> {
            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData result;
            
            // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.newBuilder()
            private Builder() {}
            
            private static Builder create() {
              Builder builder = new Builder();
              builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData();
              return builder;
            }
            
            protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData internalGetResult() {
              return result;
            }
            
            public Builder clear() {
              if (result == null) {
                throw new IllegalStateException(
                  "Cannot call clear() after build().");
              }
              result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData();
              return this;
            }
            
            public Builder clone() {
              return create().mergeFrom(result);
            }
            
            public com.google.gwt.dev.protobuf.Descriptors.Descriptor
                getDescriptorForType() {
              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.getDescriptor();
            }
            
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData getDefaultInstanceForType() {
              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.getDefaultInstance();
            }
            
            public boolean isInitialized() {
              return result.isInitialized();
            }
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData build() {
              if (result != null && !isInitialized()) {
                throw newUninitializedMessageException(result);
              }
              return buildPartial();
            }
            
            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData buildParsed()
                throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
              if (!isInitialized()) {
                throw newUninitializedMessageException(
                  result).asInvalidProtocolBufferException();
              }
              return buildPartial();
            }
            
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData buildPartial() {
              if (result == null) {
                throw new IllegalStateException(
                  "build() has already been called on this Builder.");
              }
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData returnMe = result;
              result = null;
              return returnMe;
            }
            
            public Builder mergeFrom(com.google.gwt.dev.protobuf.Message other) {
              if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData) {
                return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData)other);
              } else {
                super.mergeFrom(other);
                return this;
              }
            }
            
            public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData other) {
              if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.getDefaultInstance()) return this;
              if (other.hasSummary()) {
                setSummary(other.getSummary());
              }
              if (other.hasLevel()) {
                setLevel(other.getLevel());
              }
              if (other.hasNeedsAttention()) {
                setNeedsAttention(other.getNeedsAttention());
              }
              if (other.hasDetails()) {
                setDetails(other.getDetails());
              }
              if (other.hasHelpInfo()) {
                mergeHelpInfo(other.getHelpInfo());
              }
              this.mergeUnknownFields(other.getUnknownFields());
              return this;
            }
            
            public Builder mergeFrom(
                com.google.gwt.dev.protobuf.CodedInputStream input,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws java.io.IOException {
              com.google.gwt.dev.protobuf.UnknownFieldSet.Builder unknownFields =
                com.google.gwt.dev.protobuf.UnknownFieldSet.newBuilder(
                  this.getUnknownFields());
              while (true) {
                int tag = input.readTag();
                switch (tag) {
                  case 0:
                    this.setUnknownFields(unknownFields.build());
                    return this;
                  default: {
                    if (!parseUnknownField(input, unknownFields,
                                           extensionRegistry, tag)) {
                      this.setUnknownFields(unknownFields.build());
                      return this;
                    }
                    break;
                  }
                  case 10: {
                    setSummary(input.readString());
                    break;
                  }
                  case 18: {
                    setLevel(input.readString());
                    break;
                  }
                  case 24: {
                    setNeedsAttention(input.readBool());
                    break;
                  }
                  case 34: {
                    setDetails(input.readString());
                    break;
                  }
                  case 42: {
                    com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo.newBuilder();
                    if (hasHelpInfo()) {
                      subBuilder.mergeFrom(getHelpInfo());
                    }
                    input.readMessage(subBuilder, extensionRegistry);
                    setHelpInfo(subBuilder.buildPartial());
                    break;
                  }
                }
              }
            }
            
            
            // required string summary = 1;
            public boolean hasSummary() {
              return result.hasSummary();
            }
            public java.lang.String getSummary() {
              return result.getSummary();
            }
            public Builder setSummary(java.lang.String value) {
              if (value == null) {
    throw new NullPointerException();
  }
  result.hasSummary = true;
              result.summary_ = value;
              return this;
            }
            public Builder clearSummary() {
              result.hasSummary = false;
              result.summary_ = getDefaultInstance().getSummary();
              return this;
            }
            
            // optional string level = 2;
            public boolean hasLevel() {
              return result.hasLevel();
            }
            public java.lang.String getLevel() {
              return result.getLevel();
            }
            public Builder setLevel(java.lang.String value) {
              if (value == null) {
    throw new NullPointerException();
  }
  result.hasLevel = true;
              result.level_ = value;
              return this;
            }
            public Builder clearLevel() {
              result.hasLevel = false;
              result.level_ = getDefaultInstance().getLevel();
              return this;
            }
            
            // optional bool needsAttention = 3;
            public boolean hasNeedsAttention() {
              return result.hasNeedsAttention();
            }
            public boolean getNeedsAttention() {
              return result.getNeedsAttention();
            }
            public Builder setNeedsAttention(boolean value) {
              result.hasNeedsAttention = true;
              result.needsAttention_ = value;
              return this;
            }
            public Builder clearNeedsAttention() {
              result.hasNeedsAttention = false;
              result.needsAttention_ = false;
              return this;
            }
            
            // optional string details = 4;
            public boolean hasDetails() {
              return result.hasDetails();
            }
            public java.lang.String getDetails() {
              return result.getDetails();
            }
            public Builder setDetails(java.lang.String value) {
              if (value == null) {
    throw new NullPointerException();
  }
  result.hasDetails = true;
              result.details_ = value;
              return this;
            }
            public Builder clearDetails() {
              result.hasDetails = false;
              result.details_ = getDefaultInstance().getDetails();
              return this;
            }
            
            // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.LogData.HelpInfo helpInfo = 5;
            public boolean hasHelpInfo() {
              return result.hasHelpInfo();
            }
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo getHelpInfo() {
              return result.getHelpInfo();
            }
            public Builder setHelpInfo(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo value) {
              if (value == null) {
                throw new NullPointerException();
              }
              result.hasHelpInfo = true;
              result.helpInfo_ = value;
              return this;
            }
            public Builder setHelpInfo(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo.Builder builderForValue) {
              result.hasHelpInfo = true;
              result.helpInfo_ = builderForValue.build();
              return this;
            }
            public Builder mergeHelpInfo(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo value) {
              if (result.hasHelpInfo() &&
                  result.helpInfo_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo.getDefaultInstance()) {
                result.helpInfo_ =
                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo.newBuilder(result.helpInfo_).mergeFrom(value).buildPartial();
              } else {
                result.helpInfo_ = value;
              }
              result.hasHelpInfo = true;
              return this;
            }
            public Builder clearHelpInfo() {
              result.hasHelpInfo = false;
              result.helpInfo_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo.getDefaultInstance();
              return this;
            }
          }
          
          static {
            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
          }
          
          static {
            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
          }
        }
        
        public static final class AddLogBranch extends
            com.google.gwt.dev.protobuf.GeneratedMessage {
          // Use AddLogBranch.newBuilder() to construct.
          private AddLogBranch() {}
          
          private static final AddLogBranch defaultInstance = new AddLogBranch();
          public static AddLogBranch getDefaultInstance() {
            return defaultInstance;
          }
          
          public AddLogBranch getDefaultInstanceForType() {
            return defaultInstance;
          }
          
          public static final com.google.gwt.dev.protobuf.Descriptors.Descriptor
              getDescriptor() {
            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLogBranch_descriptor;
          }
          
          protected com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
              internalGetFieldAccessorTable() {
            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLogBranch_fieldAccessorTable;
          }
          
          // required uint32 parentLogHandle = 1;
          public static final int PARENTLOGHANDLE_FIELD_NUMBER = 1;
          private boolean hasParentLogHandle;
          private int parentLogHandle_ = 0;
          public boolean hasParentLogHandle() { return hasParentLogHandle; }
          public int getParentLogHandle() { return parentLogHandle_; }
          
          // required uint32 indexInParent = 2;
          public static final int INDEXINPARENT_FIELD_NUMBER = 2;
          private boolean hasIndexInParent;
          private int indexInParent_ = 0;
          public boolean hasIndexInParent() { return hasIndexInParent; }
          public int getIndexInParent() { return indexInParent_; }
          
          // required .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.LogData logData = 3;
          public static final int LOGDATA_FIELD_NUMBER = 3;
          private boolean hasLogData;
          private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData logData_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.getDefaultInstance();
          public boolean hasLogData() { return hasLogData; }
          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData getLogData() { return logData_; }
          
          public final boolean isInitialized() {
            if (!hasParentLogHandle) return false;
            if (!hasIndexInParent) return false;
            if (!hasLogData) return false;
            if (!getLogData().isInitialized()) return false;
            return true;
          }
          
          public void writeTo(com.google.gwt.dev.protobuf.CodedOutputStream output)
                              throws java.io.IOException {
            if (hasParentLogHandle()) {
              output.writeUInt32(1, getParentLogHandle());
            }
            if (hasIndexInParent()) {
              output.writeUInt32(2, getIndexInParent());
            }
            if (hasLogData()) {
              output.writeMessage(3, getLogData());
            }
            getUnknownFields().writeTo(output);
          }
          
          private int memoizedSerializedSize = -1;
          public int getSerializedSize() {
            int size = memoizedSerializedSize;
            if (size != -1) return size;
          
            size = 0;
            if (hasParentLogHandle()) {
              size += com.google.gwt.dev.protobuf.CodedOutputStream
                .computeUInt32Size(1, getParentLogHandle());
            }
            if (hasIndexInParent()) {
              size += com.google.gwt.dev.protobuf.CodedOutputStream
                .computeUInt32Size(2, getIndexInParent());
            }
            if (hasLogData()) {
              size += com.google.gwt.dev.protobuf.CodedOutputStream
                .computeMessageSize(3, getLogData());
            }
            size += getUnknownFields().getSerializedSize();
            memoizedSerializedSize = size;
            return size;
          }
          
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch parseFrom(
              com.google.gwt.dev.protobuf.ByteString data)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch parseFrom(
              com.google.gwt.dev.protobuf.ByteString data,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch parseFrom(byte[] data)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch parseFrom(
              byte[] data,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch parseFrom(java.io.InputStream input)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch parseFrom(
              java.io.InputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch parseDelimitedFrom(java.io.InputStream input)
              throws java.io.IOException {
            return newBuilder().mergeDelimitedFrom(input).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch parseDelimitedFrom(
              java.io.InputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch parseFrom(
              com.google.gwt.dev.protobuf.CodedInputStream input)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch parseFrom(
              com.google.gwt.dev.protobuf.CodedInputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input, extensionRegistry)
                     .buildParsed();
          }
          
          public static Builder newBuilder() { return Builder.create(); }
          public Builder newBuilderForType() { return newBuilder(); }
          public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch prototype) {
            return newBuilder().mergeFrom(prototype);
          }
          public Builder toBuilder() { return newBuilder(this); }
          
          public static final class Builder extends
              com.google.gwt.dev.protobuf.GeneratedMessage.Builder<Builder> {
            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch result;
            
            // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch.newBuilder()
            private Builder() {}
            
            private static Builder create() {
              Builder builder = new Builder();
              builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch();
              return builder;
            }
            
            protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch internalGetResult() {
              return result;
            }
            
            public Builder clear() {
              if (result == null) {
                throw new IllegalStateException(
                  "Cannot call clear() after build().");
              }
              result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch();
              return this;
            }
            
            public Builder clone() {
              return create().mergeFrom(result);
            }
            
            public com.google.gwt.dev.protobuf.Descriptors.Descriptor
                getDescriptorForType() {
              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch.getDescriptor();
            }
            
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch getDefaultInstanceForType() {
              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch.getDefaultInstance();
            }
            
            public boolean isInitialized() {
              return result.isInitialized();
            }
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch build() {
              if (result != null && !isInitialized()) {
                throw newUninitializedMessageException(result);
              }
              return buildPartial();
            }
            
            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch buildParsed()
                throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
              if (!isInitialized()) {
                throw newUninitializedMessageException(
                  result).asInvalidProtocolBufferException();
              }
              return buildPartial();
            }
            
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch buildPartial() {
              if (result == null) {
                throw new IllegalStateException(
                  "build() has already been called on this Builder.");
              }
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch returnMe = result;
              result = null;
              return returnMe;
            }
            
            public Builder mergeFrom(com.google.gwt.dev.protobuf.Message other) {
              if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch) {
                return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch)other);
              } else {
                super.mergeFrom(other);
                return this;
              }
            }
            
            public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch other) {
              if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch.getDefaultInstance()) return this;
              if (other.hasParentLogHandle()) {
                setParentLogHandle(other.getParentLogHandle());
              }
              if (other.hasIndexInParent()) {
                setIndexInParent(other.getIndexInParent());
              }
              if (other.hasLogData()) {
                mergeLogData(other.getLogData());
              }
              this.mergeUnknownFields(other.getUnknownFields());
              return this;
            }
            
            public Builder mergeFrom(
                com.google.gwt.dev.protobuf.CodedInputStream input,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws java.io.IOException {
              com.google.gwt.dev.protobuf.UnknownFieldSet.Builder unknownFields =
                com.google.gwt.dev.protobuf.UnknownFieldSet.newBuilder(
                  this.getUnknownFields());
              while (true) {
                int tag = input.readTag();
                switch (tag) {
                  case 0:
                    this.setUnknownFields(unknownFields.build());
                    return this;
                  default: {
                    if (!parseUnknownField(input, unknownFields,
                                           extensionRegistry, tag)) {
                      this.setUnknownFields(unknownFields.build());
                      return this;
                    }
                    break;
                  }
                  case 8: {
                    setParentLogHandle(input.readUInt32());
                    break;
                  }
                  case 16: {
                    setIndexInParent(input.readUInt32());
                    break;
                  }
                  case 26: {
                    com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.newBuilder();
                    if (hasLogData()) {
                      subBuilder.mergeFrom(getLogData());
                    }
                    input.readMessage(subBuilder, extensionRegistry);
                    setLogData(subBuilder.buildPartial());
                    break;
                  }
                }
              }
            }
            
            
            // required uint32 parentLogHandle = 1;
            public boolean hasParentLogHandle() {
              return result.hasParentLogHandle();
            }
            public int getParentLogHandle() {
              return result.getParentLogHandle();
            }
            public Builder setParentLogHandle(int value) {
              result.hasParentLogHandle = true;
              result.parentLogHandle_ = value;
              return this;
            }
            public Builder clearParentLogHandle() {
              result.hasParentLogHandle = false;
              result.parentLogHandle_ = 0;
              return this;
            }
            
            // required uint32 indexInParent = 2;
            public boolean hasIndexInParent() {
              return result.hasIndexInParent();
            }
            public int getIndexInParent() {
              return result.getIndexInParent();
            }
            public Builder setIndexInParent(int value) {
              result.hasIndexInParent = true;
              result.indexInParent_ = value;
              return this;
            }
            public Builder clearIndexInParent() {
              result.hasIndexInParent = false;
              result.indexInParent_ = 0;
              return this;
            }
            
            // required .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.LogData logData = 3;
            public boolean hasLogData() {
              return result.hasLogData();
            }
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData getLogData() {
              return result.getLogData();
            }
            public Builder setLogData(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData value) {
              if (value == null) {
                throw new NullPointerException();
              }
              result.hasLogData = true;
              result.logData_ = value;
              return this;
            }
            public Builder setLogData(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.Builder builderForValue) {
              result.hasLogData = true;
              result.logData_ = builderForValue.build();
              return this;
            }
            public Builder mergeLogData(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData value) {
              if (result.hasLogData() &&
                  result.logData_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.getDefaultInstance()) {
                result.logData_ =
                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.newBuilder(result.logData_).mergeFrom(value).buildPartial();
              } else {
                result.logData_ = value;
              }
              result.hasLogData = true;
              return this;
            }
            public Builder clearLogData() {
              result.hasLogData = false;
              result.logData_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.getDefaultInstance();
              return this;
            }
          }
          
          static {
            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
          }
          
          static {
            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
          }
        }
        
        public static final class AddLogEntry extends
            com.google.gwt.dev.protobuf.GeneratedMessage {
          // Use AddLogEntry.newBuilder() to construct.
          private AddLogEntry() {}
          
          private static final AddLogEntry defaultInstance = new AddLogEntry();
          public static AddLogEntry getDefaultInstance() {
            return defaultInstance;
          }
          
          public AddLogEntry getDefaultInstanceForType() {
            return defaultInstance;
          }
          
          public static final com.google.gwt.dev.protobuf.Descriptors.Descriptor
              getDescriptor() {
            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLogEntry_descriptor;
          }
          
          protected com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
              internalGetFieldAccessorTable() {
            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLogEntry_fieldAccessorTable;
          }
          
          // required uint32 logHandle = 1;
          public static final int LOGHANDLE_FIELD_NUMBER = 1;
          private boolean hasLogHandle;
          private int logHandle_ = 0;
          public boolean hasLogHandle() { return hasLogHandle; }
          public int getLogHandle() { return logHandle_; }
          
          // required uint32 indexInLog = 2;
          public static final int INDEXINLOG_FIELD_NUMBER = 2;
          private boolean hasIndexInLog;
          private int indexInLog_ = 0;
          public boolean hasIndexInLog() { return hasIndexInLog; }
          public int getIndexInLog() { return indexInLog_; }
          
          // required .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.LogData logData = 3;
          public static final int LOGDATA_FIELD_NUMBER = 3;
          private boolean hasLogData;
          private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData logData_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.getDefaultInstance();
          public boolean hasLogData() { return hasLogData; }
          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData getLogData() { return logData_; }
          
          public final boolean isInitialized() {
            if (!hasLogHandle) return false;
            if (!hasIndexInLog) return false;
            if (!hasLogData) return false;
            if (!getLogData().isInitialized()) return false;
            return true;
          }
          
          public void writeTo(com.google.gwt.dev.protobuf.CodedOutputStream output)
                              throws java.io.IOException {
            if (hasLogHandle()) {
              output.writeUInt32(1, getLogHandle());
            }
            if (hasIndexInLog()) {
              output.writeUInt32(2, getIndexInLog());
            }
            if (hasLogData()) {
              output.writeMessage(3, getLogData());
            }
            getUnknownFields().writeTo(output);
          }
          
          private int memoizedSerializedSize = -1;
          public int getSerializedSize() {
            int size = memoizedSerializedSize;
            if (size != -1) return size;
          
            size = 0;
            if (hasLogHandle()) {
              size += com.google.gwt.dev.protobuf.CodedOutputStream
                .computeUInt32Size(1, getLogHandle());
            }
            if (hasIndexInLog()) {
              size += com.google.gwt.dev.protobuf.CodedOutputStream
                .computeUInt32Size(2, getIndexInLog());
            }
            if (hasLogData()) {
              size += com.google.gwt.dev.protobuf.CodedOutputStream
                .computeMessageSize(3, getLogData());
            }
            size += getUnknownFields().getSerializedSize();
            memoizedSerializedSize = size;
            return size;
          }
          
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry parseFrom(
              com.google.gwt.dev.protobuf.ByteString data)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry parseFrom(
              com.google.gwt.dev.protobuf.ByteString data,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry parseFrom(byte[] data)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry parseFrom(
              byte[] data,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry parseFrom(java.io.InputStream input)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry parseFrom(
              java.io.InputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry parseDelimitedFrom(java.io.InputStream input)
              throws java.io.IOException {
            return newBuilder().mergeDelimitedFrom(input).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry parseDelimitedFrom(
              java.io.InputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry parseFrom(
              com.google.gwt.dev.protobuf.CodedInputStream input)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry parseFrom(
              com.google.gwt.dev.protobuf.CodedInputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input, extensionRegistry)
                     .buildParsed();
          }
          
          public static Builder newBuilder() { return Builder.create(); }
          public Builder newBuilderForType() { return newBuilder(); }
          public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry prototype) {
            return newBuilder().mergeFrom(prototype);
          }
          public Builder toBuilder() { return newBuilder(this); }
          
          public static final class Builder extends
              com.google.gwt.dev.protobuf.GeneratedMessage.Builder<Builder> {
            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry result;
            
            // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry.newBuilder()
            private Builder() {}
            
            private static Builder create() {
              Builder builder = new Builder();
              builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry();
              return builder;
            }
            
            protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry internalGetResult() {
              return result;
            }
            
            public Builder clear() {
              if (result == null) {
                throw new IllegalStateException(
                  "Cannot call clear() after build().");
              }
              result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry();
              return this;
            }
            
            public Builder clone() {
              return create().mergeFrom(result);
            }
            
            public com.google.gwt.dev.protobuf.Descriptors.Descriptor
                getDescriptorForType() {
              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry.getDescriptor();
            }
            
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry getDefaultInstanceForType() {
              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry.getDefaultInstance();
            }
            
            public boolean isInitialized() {
              return result.isInitialized();
            }
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry build() {
              if (result != null && !isInitialized()) {
                throw newUninitializedMessageException(result);
              }
              return buildPartial();
            }
            
            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry buildParsed()
                throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
              if (!isInitialized()) {
                throw newUninitializedMessageException(
                  result).asInvalidProtocolBufferException();
              }
              return buildPartial();
            }
            
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry buildPartial() {
              if (result == null) {
                throw new IllegalStateException(
                  "build() has already been called on this Builder.");
              }
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry returnMe = result;
              result = null;
              return returnMe;
            }
            
            public Builder mergeFrom(com.google.gwt.dev.protobuf.Message other) {
              if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry) {
                return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry)other);
              } else {
                super.mergeFrom(other);
                return this;
              }
            }
            
            public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry other) {
              if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry.getDefaultInstance()) return this;
              if (other.hasLogHandle()) {
                setLogHandle(other.getLogHandle());
              }
              if (other.hasIndexInLog()) {
                setIndexInLog(other.getIndexInLog());
              }
              if (other.hasLogData()) {
                mergeLogData(other.getLogData());
              }
              this.mergeUnknownFields(other.getUnknownFields());
              return this;
            }
            
            public Builder mergeFrom(
                com.google.gwt.dev.protobuf.CodedInputStream input,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws java.io.IOException {
              com.google.gwt.dev.protobuf.UnknownFieldSet.Builder unknownFields =
                com.google.gwt.dev.protobuf.UnknownFieldSet.newBuilder(
                  this.getUnknownFields());
              while (true) {
                int tag = input.readTag();
                switch (tag) {
                  case 0:
                    this.setUnknownFields(unknownFields.build());
                    return this;
                  default: {
                    if (!parseUnknownField(input, unknownFields,
                                           extensionRegistry, tag)) {
                      this.setUnknownFields(unknownFields.build());
                      return this;
                    }
                    break;
                  }
                  case 8: {
                    setLogHandle(input.readUInt32());
                    break;
                  }
                  case 16: {
                    setIndexInLog(input.readUInt32());
                    break;
                  }
                  case 26: {
                    com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.newBuilder();
                    if (hasLogData()) {
                      subBuilder.mergeFrom(getLogData());
                    }
                    input.readMessage(subBuilder, extensionRegistry);
                    setLogData(subBuilder.buildPartial());
                    break;
                  }
                }
              }
            }
            
            
            // required uint32 logHandle = 1;
            public boolean hasLogHandle() {
              return result.hasLogHandle();
            }
            public int getLogHandle() {
              return result.getLogHandle();
            }
            public Builder setLogHandle(int value) {
              result.hasLogHandle = true;
              result.logHandle_ = value;
              return this;
            }
            public Builder clearLogHandle() {
              result.hasLogHandle = false;
              result.logHandle_ = 0;
              return this;
            }
            
            // required uint32 indexInLog = 2;
            public boolean hasIndexInLog() {
              return result.hasIndexInLog();
            }
            public int getIndexInLog() {
              return result.getIndexInLog();
            }
            public Builder setIndexInLog(int value) {
              result.hasIndexInLog = true;
              result.indexInLog_ = value;
              return this;
            }
            public Builder clearIndexInLog() {
              result.hasIndexInLog = false;
              result.indexInLog_ = 0;
              return this;
            }
            
            // required .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.LogData logData = 3;
            public boolean hasLogData() {
              return result.hasLogData();
            }
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData getLogData() {
              return result.getLogData();
            }
            public Builder setLogData(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData value) {
              if (value == null) {
                throw new NullPointerException();
              }
              result.hasLogData = true;
              result.logData_ = value;
              return this;
            }
            public Builder setLogData(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.Builder builderForValue) {
              result.hasLogData = true;
              result.logData_ = builderForValue.build();
              return this;
            }
            public Builder mergeLogData(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData value) {
              if (result.hasLogData() &&
                  result.logData_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.getDefaultInstance()) {
                result.logData_ =
                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.newBuilder(result.logData_).mergeFrom(value).buildPartial();
              } else {
                result.logData_ = value;
              }
              result.hasLogData = true;
              return this;
            }
            public Builder clearLogData() {
              result.hasLogData = false;
              result.logData_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.getDefaultInstance();
              return this;
            }
          }
          
          static {
            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
          }
          
          static {
            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
          }
        }
        
        public static final class DisconnectLog extends
            com.google.gwt.dev.protobuf.GeneratedMessage {
          // Use DisconnectLog.newBuilder() to construct.
          private DisconnectLog() {}
          
          private static final DisconnectLog defaultInstance = new DisconnectLog();
          public static DisconnectLog getDefaultInstance() {
            return defaultInstance;
          }
          
          public DisconnectLog getDefaultInstanceForType() {
            return defaultInstance;
          }
          
          public static final com.google.gwt.dev.protobuf.Descriptors.Descriptor
              getDescriptor() {
            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_DisconnectLog_descriptor;
          }
          
          protected com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
              internalGetFieldAccessorTable() {
            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_DisconnectLog_fieldAccessorTable;
          }
          
          // required uint32 logHandle = 1;
          public static final int LOGHANDLE_FIELD_NUMBER = 1;
          private boolean hasLogHandle;
          private int logHandle_ = 0;
          public boolean hasLogHandle() { return hasLogHandle; }
          public int getLogHandle() { return logHandle_; }
          
          public final boolean isInitialized() {
            if (!hasLogHandle) return false;
            return true;
          }
          
          public void writeTo(com.google.gwt.dev.protobuf.CodedOutputStream output)
                              throws java.io.IOException {
            if (hasLogHandle()) {
              output.writeUInt32(1, getLogHandle());
            }
            getUnknownFields().writeTo(output);
          }
          
          private int memoizedSerializedSize = -1;
          public int getSerializedSize() {
            int size = memoizedSerializedSize;
            if (size != -1) return size;
          
            size = 0;
            if (hasLogHandle()) {
              size += com.google.gwt.dev.protobuf.CodedOutputStream
                .computeUInt32Size(1, getLogHandle());
            }
            size += getUnknownFields().getSerializedSize();
            memoizedSerializedSize = size;
            return size;
          }
          
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog parseFrom(
              com.google.gwt.dev.protobuf.ByteString data)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog parseFrom(
              com.google.gwt.dev.protobuf.ByteString data,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog parseFrom(byte[] data)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog parseFrom(
              byte[] data,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog parseFrom(java.io.InputStream input)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog parseFrom(
              java.io.InputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog parseDelimitedFrom(java.io.InputStream input)
              throws java.io.IOException {
            return newBuilder().mergeDelimitedFrom(input).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog parseDelimitedFrom(
              java.io.InputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog parseFrom(
              com.google.gwt.dev.protobuf.CodedInputStream input)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog parseFrom(
              com.google.gwt.dev.protobuf.CodedInputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input, extensionRegistry)
                     .buildParsed();
          }
          
          public static Builder newBuilder() { return Builder.create(); }
          public Builder newBuilderForType() { return newBuilder(); }
          public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog prototype) {
            return newBuilder().mergeFrom(prototype);
          }
          public Builder toBuilder() { return newBuilder(this); }
          
          public static final class Builder extends
              com.google.gwt.dev.protobuf.GeneratedMessage.Builder<Builder> {
            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog result;
            
            // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog.newBuilder()
            private Builder() {}
            
            private static Builder create() {
              Builder builder = new Builder();
              builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog();
              return builder;
            }
            
            protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog internalGetResult() {
              return result;
            }
            
            public Builder clear() {
              if (result == null) {
                throw new IllegalStateException(
                  "Cannot call clear() after build().");
              }
              result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog();
              return this;
            }
            
            public Builder clone() {
              return create().mergeFrom(result);
            }
            
            public com.google.gwt.dev.protobuf.Descriptors.Descriptor
                getDescriptorForType() {
              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog.getDescriptor();
            }
            
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog getDefaultInstanceForType() {
              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog.getDefaultInstance();
            }
            
            public boolean isInitialized() {
              return result.isInitialized();
            }
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog build() {
              if (result != null && !isInitialized()) {
                throw newUninitializedMessageException(result);
              }
              return buildPartial();
            }
            
            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog buildParsed()
                throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
              if (!isInitialized()) {
                throw newUninitializedMessageException(
                  result).asInvalidProtocolBufferException();
              }
              return buildPartial();
            }
            
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog buildPartial() {
              if (result == null) {
                throw new IllegalStateException(
                  "build() has already been called on this Builder.");
              }
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog returnMe = result;
              result = null;
              return returnMe;
            }
            
            public Builder mergeFrom(com.google.gwt.dev.protobuf.Message other) {
              if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog) {
                return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog)other);
              } else {
                super.mergeFrom(other);
                return this;
              }
            }
            
            public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog other) {
              if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog.getDefaultInstance()) return this;
              if (other.hasLogHandle()) {
                setLogHandle(other.getLogHandle());
              }
              this.mergeUnknownFields(other.getUnknownFields());
              return this;
            }
            
            public Builder mergeFrom(
                com.google.gwt.dev.protobuf.CodedInputStream input,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws java.io.IOException {
              com.google.gwt.dev.protobuf.UnknownFieldSet.Builder unknownFields =
                com.google.gwt.dev.protobuf.UnknownFieldSet.newBuilder(
                  this.getUnknownFields());
              while (true) {
                int tag = input.readTag();
                switch (tag) {
                  case 0:
                    this.setUnknownFields(unknownFields.build());
                    return this;
                  default: {
                    if (!parseUnknownField(input, unknownFields,
                                           extensionRegistry, tag)) {
                      this.setUnknownFields(unknownFields.build());
                      return this;
                    }
                    break;
                  }
                  case 8: {
                    setLogHandle(input.readUInt32());
                    break;
                  }
                }
              }
            }
            
            
            // required uint32 logHandle = 1;
            public boolean hasLogHandle() {
              return result.hasLogHandle();
            }
            public int getLogHandle() {
              return result.getLogHandle();
            }
            public Builder setLogHandle(int value) {
              result.hasLogHandle = true;
              result.logHandle_ = value;
              return this;
            }
            public Builder clearLogHandle() {
              result.hasLogHandle = false;
              result.logHandle_ = 0;
              return this;
            }
          }
          
          static {
            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
          }
          
          static {
            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
          }
        }
        
        public static final class Initialize extends
            com.google.gwt.dev.protobuf.GeneratedMessage {
          // Use Initialize.newBuilder() to construct.
          private Initialize() {}
          
          private static final Initialize defaultInstance = new Initialize();
          public static Initialize getDefaultInstance() {
            return defaultInstance;
          }
          
          public Initialize getDefaultInstanceForType() {
            return defaultInstance;
          }
          
          public static final com.google.gwt.dev.protobuf.Descriptors.Descriptor
              getDescriptor() {
            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_Initialize_descriptor;
          }
          
          protected com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
              internalGetFieldAccessorTable() {
            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_Initialize_fieldAccessorTable;
          }
          
          // optional string clientId = 1;
          public static final int CLIENTID_FIELD_NUMBER = 1;
          private boolean hasClientId;
          private java.lang.String clientId_ = "";
          public boolean hasClientId() { return hasClientId; }
          public java.lang.String getClientId() { return clientId_; }
          
          // repeated string startupURLs = 2;
          public static final int STARTUPURLS_FIELD_NUMBER = 2;
          private java.util.List<java.lang.String> startupURLs_ =
            java.util.Collections.emptyList();
          public java.util.List<java.lang.String> getStartupURLsList() {
            return startupURLs_;
          }
          public int getStartupURLsCount() { return startupURLs_.size(); }
          public java.lang.String getStartupURLs(int index) {
            return startupURLs_.get(index);
          }
          
          public final boolean isInitialized() {
            return true;
          }
          
          public void writeTo(com.google.gwt.dev.protobuf.CodedOutputStream output)
                              throws java.io.IOException {
            if (hasClientId()) {
              output.writeString(1, getClientId());
            }
            for (java.lang.String element : getStartupURLsList()) {
              output.writeString(2, element);
            }
            getUnknownFields().writeTo(output);
          }
          
          private int memoizedSerializedSize = -1;
          public int getSerializedSize() {
            int size = memoizedSerializedSize;
            if (size != -1) return size;
          
            size = 0;
            if (hasClientId()) {
              size += com.google.gwt.dev.protobuf.CodedOutputStream
                .computeStringSize(1, getClientId());
            }
            {
              int dataSize = 0;
              for (java.lang.String element : getStartupURLsList()) {
                dataSize += com.google.gwt.dev.protobuf.CodedOutputStream
                  .computeStringSizeNoTag(element);
              }
              size += dataSize;
              size += 1 * getStartupURLsList().size();
            }
            size += getUnknownFields().getSerializedSize();
            memoizedSerializedSize = size;
            return size;
          }
          
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Initialize parseFrom(
              com.google.gwt.dev.protobuf.ByteString data)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Initialize parseFrom(
              com.google.gwt.dev.protobuf.ByteString data,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Initialize parseFrom(byte[] data)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Initialize parseFrom(
              byte[] data,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Initialize parseFrom(java.io.InputStream input)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Initialize parseFrom(
              java.io.InputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Initialize parseDelimitedFrom(java.io.InputStream input)
              throws java.io.IOException {
            return newBuilder().mergeDelimitedFrom(input).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Initialize parseDelimitedFrom(
              java.io.InputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Initialize parseFrom(
              com.google.gwt.dev.protobuf.CodedInputStream input)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Initialize parseFrom(
              com.google.gwt.dev.protobuf.CodedInputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input, extensionRegistry)
                     .buildParsed();
          }
          
          public static Builder newBuilder() { return Builder.create(); }
          public Builder newBuilderForType() { return newBuilder(); }
          public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Initialize prototype) {
            return newBuilder().mergeFrom(prototype);
          }
          public Builder toBuilder() { return newBuilder(this); }
          
          public static final class Builder extends
              com.google.gwt.dev.protobuf.GeneratedMessage.Builder<Builder> {
            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Initialize result;
            
            // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Initialize.newBuilder()
            private Builder() {}
            
            private static Builder create() {
              Builder builder = new Builder();
              builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Initialize();
              return builder;
            }
            
            protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Initialize internalGetResult() {
              return result;
            }
            
            public Builder clear() {
              if (result == null) {
                throw new IllegalStateException(
                  "Cannot call clear() after build().");
              }
              result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Initialize();
              return this;
            }
            
            public Builder clone() {
              return create().mergeFrom(result);
            }
            
            public com.google.gwt.dev.protobuf.Descriptors.Descriptor
                getDescriptorForType() {
              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Initialize.getDescriptor();
            }
            
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Initialize getDefaultInstanceForType() {
              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Initialize.getDefaultInstance();
            }
            
            public boolean isInitialized() {
              return result.isInitialized();
            }
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Initialize build() {
              if (result != null && !isInitialized()) {
                throw newUninitializedMessageException(result);
              }
              return buildPartial();
            }
            
            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Initialize buildParsed()
                throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
              if (!isInitialized()) {
                throw newUninitializedMessageException(
                  result).asInvalidProtocolBufferException();
              }
              return buildPartial();
            }
            
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Initialize buildPartial() {
              if (result == null) {
                throw new IllegalStateException(
                  "build() has already been called on this Builder.");
              }
              if (result.startupURLs_ != java.util.Collections.EMPTY_LIST) {
                result.startupURLs_ =
                  java.util.Collections.unmodifiableList(result.startupURLs_);
              }
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Initialize returnMe = result;
              result = null;
              return returnMe;
            }
            
            public Builder mergeFrom(com.google.gwt.dev.protobuf.Message other) {
              if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Initialize) {
                return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Initialize)other);
              } else {
                super.mergeFrom(other);
                return this;
              }
            }
            
            public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Initialize other) {
              if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Initialize.getDefaultInstance()) return this;
              if (other.hasClientId()) {
                setClientId(other.getClientId());
              }
              if (!other.startupURLs_.isEmpty()) {
                if (result.startupURLs_.isEmpty()) {
                  result.startupURLs_ = new java.util.ArrayList<java.lang.String>();
                }
                result.startupURLs_.addAll(other.startupURLs_);
              }
              this.mergeUnknownFields(other.getUnknownFields());
              return this;
            }
            
            public Builder mergeFrom(
                com.google.gwt.dev.protobuf.CodedInputStream input,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws java.io.IOException {
              com.google.gwt.dev.protobuf.UnknownFieldSet.Builder unknownFields =
                com.google.gwt.dev.protobuf.UnknownFieldSet.newBuilder(
                  this.getUnknownFields());
              while (true) {
                int tag = input.readTag();
                switch (tag) {
                  case 0:
                    this.setUnknownFields(unknownFields.build());
                    return this;
                  default: {
                    if (!parseUnknownField(input, unknownFields,
                                           extensionRegistry, tag)) {
                      this.setUnknownFields(unknownFields.build());
                      return this;
                    }
                    break;
                  }
                  case 10: {
                    setClientId(input.readString());
                    break;
                  }
                  case 18: {
                    addStartupURLs(input.readString());
                    break;
                  }
                }
              }
            }
            
            
            // optional string clientId = 1;
            public boolean hasClientId() {
              return result.hasClientId();
            }
            public java.lang.String getClientId() {
              return result.getClientId();
            }
            public Builder setClientId(java.lang.String value) {
              if (value == null) {
    throw new NullPointerException();
  }
  result.hasClientId = true;
              result.clientId_ = value;
              return this;
            }
            public Builder clearClientId() {
              result.hasClientId = false;
              result.clientId_ = getDefaultInstance().getClientId();
              return this;
            }
            
            // repeated string startupURLs = 2;
            public java.util.List<java.lang.String> getStartupURLsList() {
              return java.util.Collections.unmodifiableList(result.startupURLs_);
            }
            public int getStartupURLsCount() {
              return result.getStartupURLsCount();
            }
            public java.lang.String getStartupURLs(int index) {
              return result.getStartupURLs(index);
            }
            public Builder setStartupURLs(int index, java.lang.String value) {
              if (value == null) {
    throw new NullPointerException();
  }
  result.startupURLs_.set(index, value);
              return this;
            }
            public Builder addStartupURLs(java.lang.String value) {
              if (value == null) {
    throw new NullPointerException();
  }
  if (result.startupURLs_.isEmpty()) {
                result.startupURLs_ = new java.util.ArrayList<java.lang.String>();
              }
              result.startupURLs_.add(value);
              return this;
            }
            public Builder addAllStartupURLs(
                java.lang.Iterable<? extends java.lang.String> values) {
              if (result.startupURLs_.isEmpty()) {
                result.startupURLs_ = new java.util.ArrayList<java.lang.String>();
              }
              super.addAll(values, result.startupURLs_);
              return this;
            }
            public Builder clearStartupURLs() {
              result.startupURLs_ = java.util.Collections.emptyList();
              return this;
            }
          }
          
          static {
            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
          }
          
          static {
            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
          }
        }
        
        // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.RequestType requestType = 1;
        public static final int REQUESTTYPE_FIELD_NUMBER = 1;
        private boolean hasRequestType;
        private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.RequestType requestType_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.RequestType.CAPABILITY_EXCHANGE;
        public boolean hasRequestType() { return hasRequestType; }
        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.RequestType getRequestType() { return requestType_; }
        
        // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.CapabilityExchange capabilityExchange = 2;
        public static final int CAPABILITYEXCHANGE_FIELD_NUMBER = 2;
        private boolean hasCapabilityExchange;
        private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange capabilityExchange_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange.getDefaultInstance();
        public boolean hasCapabilityExchange() { return hasCapabilityExchange; }
        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange getCapabilityExchange() { return capabilityExchange_; }
        
        // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.AddLog addLog = 3;
        public static final int ADDLOG_FIELD_NUMBER = 3;
        private boolean hasAddLog;
        private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog addLog_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.getDefaultInstance();
        public boolean hasAddLog() { return hasAddLog; }
        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog getAddLog() { return addLog_; }
        
        // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.AddLogBranch addLogBranch = 4;
        public static final int ADDLOGBRANCH_FIELD_NUMBER = 4;
        private boolean hasAddLogBranch;
        private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch addLogBranch_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch.getDefaultInstance();
        public boolean hasAddLogBranch() { return hasAddLogBranch; }
        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch getAddLogBranch() { return addLogBranch_; }
        
        // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.AddLogEntry addLogEntry = 5;
        public static final int ADDLOGENTRY_FIELD_NUMBER = 5;
        private boolean hasAddLogEntry;
        private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry addLogEntry_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry.getDefaultInstance();
        public boolean hasAddLogEntry() { return hasAddLogEntry; }
        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry getAddLogEntry() { return addLogEntry_; }
        
        // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.DisconnectLog disconnectLog = 6;
        public static final int DISCONNECTLOG_FIELD_NUMBER = 6;
        private boolean hasDisconnectLog;
        private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog disconnectLog_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog.getDefaultInstance();
        public boolean hasDisconnectLog() { return hasDisconnectLog; }
        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog getDisconnectLog() { return disconnectLog_; }
        
        // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.Initialize initialize = 7;
        public static final int INITIALIZE_FIELD_NUMBER = 7;
        private boolean hasInitialize;
        private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Initialize initialize_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Initialize.getDefaultInstance();
        public boolean hasInitialize() { return hasInitialize; }
        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Initialize getInitialize() { return initialize_; }
        
        public final boolean isInitialized() {
          if (hasAddLog()) {
            if (!getAddLog().isInitialized()) return false;
          }
          if (hasAddLogBranch()) {
            if (!getAddLogBranch().isInitialized()) return false;
          }
          if (hasAddLogEntry()) {
            if (!getAddLogEntry().isInitialized()) return false;
          }
          if (hasDisconnectLog()) {
            if (!getDisconnectLog().isInitialized()) return false;
          }
          return true;
        }
        
        public void writeTo(com.google.gwt.dev.protobuf.CodedOutputStream output)
                            throws java.io.IOException {
          if (hasRequestType()) {
            output.writeEnum(1, getRequestType().getNumber());
          }
          if (hasCapabilityExchange()) {
            output.writeMessage(2, getCapabilityExchange());
          }
          if (hasAddLog()) {
            output.writeMessage(3, getAddLog());
          }
          if (hasAddLogBranch()) {
            output.writeMessage(4, getAddLogBranch());
          }
          if (hasAddLogEntry()) {
            output.writeMessage(5, getAddLogEntry());
          }
          if (hasDisconnectLog()) {
            output.writeMessage(6, getDisconnectLog());
          }
          if (hasInitialize()) {
            output.writeMessage(7, getInitialize());
          }
          getUnknownFields().writeTo(output);
        }
        
        private int memoizedSerializedSize = -1;
        public int getSerializedSize() {
          int size = memoizedSerializedSize;
          if (size != -1) return size;
        
          size = 0;
          if (hasRequestType()) {
            size += com.google.gwt.dev.protobuf.CodedOutputStream
              .computeEnumSize(1, getRequestType().getNumber());
          }
          if (hasCapabilityExchange()) {
            size += com.google.gwt.dev.protobuf.CodedOutputStream
              .computeMessageSize(2, getCapabilityExchange());
          }
          if (hasAddLog()) {
            size += com.google.gwt.dev.protobuf.CodedOutputStream
              .computeMessageSize(3, getAddLog());
          }
          if (hasAddLogBranch()) {
            size += com.google.gwt.dev.protobuf.CodedOutputStream
              .computeMessageSize(4, getAddLogBranch());
          }
          if (hasAddLogEntry()) {
            size += com.google.gwt.dev.protobuf.CodedOutputStream
              .computeMessageSize(5, getAddLogEntry());
          }
          if (hasDisconnectLog()) {
            size += com.google.gwt.dev.protobuf.CodedOutputStream
              .computeMessageSize(6, getDisconnectLog());
          }
          if (hasInitialize()) {
            size += com.google.gwt.dev.protobuf.CodedOutputStream
              .computeMessageSize(7, getInitialize());
          }
          size += getUnknownFields().getSerializedSize();
          memoizedSerializedSize = size;
          return size;
        }
        
        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest parseFrom(
            com.google.gwt.dev.protobuf.ByteString data)
            throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
          return newBuilder().mergeFrom(data).buildParsed();
        }
        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest parseFrom(
            com.google.gwt.dev.protobuf.ByteString data,
            com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
          return newBuilder().mergeFrom(data, extensionRegistry)
                   .buildParsed();
        }
        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest parseFrom(byte[] data)
            throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
          return newBuilder().mergeFrom(data).buildParsed();
        }
        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest parseFrom(
            byte[] data,
            com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
          return newBuilder().mergeFrom(data, extensionRegistry)
                   .buildParsed();
        }
        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest parseFrom(java.io.InputStream input)
            throws java.io.IOException {
          return newBuilder().mergeFrom(input).buildParsed();
        }
        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest parseFrom(
            java.io.InputStream input,
            com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          return newBuilder().mergeFrom(input, extensionRegistry)
                   .buildParsed();
        }
        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest parseDelimitedFrom(java.io.InputStream input)
            throws java.io.IOException {
          return newBuilder().mergeDelimitedFrom(input).buildParsed();
        }
        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest parseDelimitedFrom(
            java.io.InputStream input,
            com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
                   .buildParsed();
        }
        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest parseFrom(
            com.google.gwt.dev.protobuf.CodedInputStream input)
            throws java.io.IOException {
          return newBuilder().mergeFrom(input).buildParsed();
        }
        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest parseFrom(
            com.google.gwt.dev.protobuf.CodedInputStream input,
            com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          return newBuilder().mergeFrom(input, extensionRegistry)
                   .buildParsed();
        }
        
        public static Builder newBuilder() { return Builder.create(); }
        public Builder newBuilderForType() { return newBuilder(); }
        public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest prototype) {
          return newBuilder().mergeFrom(prototype);
        }
        public Builder toBuilder() { return newBuilder(this); }
        
        public static final class Builder extends
            com.google.gwt.dev.protobuf.GeneratedMessage.Builder<Builder> {
          private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest result;
          
          // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.newBuilder()
          private Builder() {}
          
          private static Builder create() {
            Builder builder = new Builder();
            builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest();
            return builder;
          }
          
          protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest internalGetResult() {
            return result;
          }
          
          public Builder clear() {
            if (result == null) {
              throw new IllegalStateException(
                "Cannot call clear() after build().");
            }
            result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest();
            return this;
          }
          
          public Builder clone() {
            return create().mergeFrom(result);
          }
          
          public com.google.gwt.dev.protobuf.Descriptors.Descriptor
              getDescriptorForType() {
            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.getDescriptor();
          }
          
          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest getDefaultInstanceForType() {
            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.getDefaultInstance();
          }
          
          public boolean isInitialized() {
            return result.isInitialized();
          }
          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest build() {
            if (result != null && !isInitialized()) {
              throw newUninitializedMessageException(result);
            }
            return buildPartial();
          }
          
          private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest buildParsed()
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            if (!isInitialized()) {
              throw newUninitializedMessageException(
                result).asInvalidProtocolBufferException();
            }
            return buildPartial();
          }
          
          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest buildPartial() {
            if (result == null) {
              throw new IllegalStateException(
                "build() has already been called on this Builder.");
            }
            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest returnMe = result;
            result = null;
            return returnMe;
          }
          
          public Builder mergeFrom(com.google.gwt.dev.protobuf.Message other) {
            if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest) {
              return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest)other);
            } else {
              super.mergeFrom(other);
              return this;
            }
          }
          
          public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest other) {
            if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.getDefaultInstance()) return this;
            if (other.hasRequestType()) {
              setRequestType(other.getRequestType());
            }
            if (other.hasCapabilityExchange()) {
              mergeCapabilityExchange(other.getCapabilityExchange());
            }
            if (other.hasAddLog()) {
              mergeAddLog(other.getAddLog());
            }
            if (other.hasAddLogBranch()) {
              mergeAddLogBranch(other.getAddLogBranch());
            }
            if (other.hasAddLogEntry()) {
              mergeAddLogEntry(other.getAddLogEntry());
            }
            if (other.hasDisconnectLog()) {
              mergeDisconnectLog(other.getDisconnectLog());
            }
            if (other.hasInitialize()) {
              mergeInitialize(other.getInitialize());
            }
            this.mergeUnknownFields(other.getUnknownFields());
            return this;
          }
          
          public Builder mergeFrom(
              com.google.gwt.dev.protobuf.CodedInputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            com.google.gwt.dev.protobuf.UnknownFieldSet.Builder unknownFields =
              com.google.gwt.dev.protobuf.UnknownFieldSet.newBuilder(
                this.getUnknownFields());
            while (true) {
              int tag = input.readTag();
              switch (tag) {
                case 0:
                  this.setUnknownFields(unknownFields.build());
                  return this;
                default: {
                  if (!parseUnknownField(input, unknownFields,
                                         extensionRegistry, tag)) {
                    this.setUnknownFields(unknownFields.build());
                    return this;
                  }
                  break;
                }
                case 8: {
                  int rawValue = input.readEnum();
                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.RequestType value = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.RequestType.valueOf(rawValue);
                  if (value == null) {
                    unknownFields.mergeVarintField(1, rawValue);
                  } else {
                    setRequestType(value);
                  }
                  break;
                }
                case 18: {
                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange.newBuilder();
                  if (hasCapabilityExchange()) {
                    subBuilder.mergeFrom(getCapabilityExchange());
                  }
                  input.readMessage(subBuilder, extensionRegistry);
                  setCapabilityExchange(subBuilder.buildPartial());
                  break;
                }
                case 26: {
                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.newBuilder();
                  if (hasAddLog()) {
                    subBuilder.mergeFrom(getAddLog());
                  }
                  input.readMessage(subBuilder, extensionRegistry);
                  setAddLog(subBuilder.buildPartial());
                  break;
                }
                case 34: {
                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch.newBuilder();
                  if (hasAddLogBranch()) {
                    subBuilder.mergeFrom(getAddLogBranch());
                  }
                  input.readMessage(subBuilder, extensionRegistry);
                  setAddLogBranch(subBuilder.buildPartial());
                  break;
                }
                case 42: {
                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry.newBuilder();
                  if (hasAddLogEntry()) {
                    subBuilder.mergeFrom(getAddLogEntry());
                  }
                  input.readMessage(subBuilder, extensionRegistry);
                  setAddLogEntry(subBuilder.buildPartial());
                  break;
                }
                case 50: {
                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog.newBuilder();
                  if (hasDisconnectLog()) {
                    subBuilder.mergeFrom(getDisconnectLog());
                  }
                  input.readMessage(subBuilder, extensionRegistry);
                  setDisconnectLog(subBuilder.buildPartial());
                  break;
                }
                case 58: {
                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Initialize.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Initialize.newBuilder();
                  if (hasInitialize()) {
                    subBuilder.mergeFrom(getInitialize());
                  }
                  input.readMessage(subBuilder, extensionRegistry);
                  setInitialize(subBuilder.buildPartial());
                  break;
                }
              }
            }
          }
          
          
          // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.RequestType requestType = 1;
          public boolean hasRequestType() {
            return result.hasRequestType();
          }
          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.RequestType getRequestType() {
            return result.getRequestType();
          }
          public Builder setRequestType(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.RequestType value) {
            if (value == null) {
              throw new NullPointerException();
            }
            result.hasRequestType = true;
            result.requestType_ = value;
            return this;
          }
          public Builder clearRequestType() {
            result.hasRequestType = false;
            result.requestType_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.RequestType.CAPABILITY_EXCHANGE;
            return this;
          }
          
          // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.CapabilityExchange capabilityExchange = 2;
          public boolean hasCapabilityExchange() {
            return result.hasCapabilityExchange();
          }
          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange getCapabilityExchange() {
            return result.getCapabilityExchange();
          }
          public Builder setCapabilityExchange(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange value) {
            if (value == null) {
              throw new NullPointerException();
            }
            result.hasCapabilityExchange = true;
            result.capabilityExchange_ = value;
            return this;
          }
          public Builder setCapabilityExchange(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange.Builder builderForValue) {
            result.hasCapabilityExchange = true;
            result.capabilityExchange_ = builderForValue.build();
            return this;
          }
          public Builder mergeCapabilityExchange(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange value) {
            if (result.hasCapabilityExchange() &&
                result.capabilityExchange_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange.getDefaultInstance()) {
              result.capabilityExchange_ =
                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange.newBuilder(result.capabilityExchange_).mergeFrom(value).buildPartial();
            } else {
              result.capabilityExchange_ = value;
            }
            result.hasCapabilityExchange = true;
            return this;
          }
          public Builder clearCapabilityExchange() {
            result.hasCapabilityExchange = false;
            result.capabilityExchange_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange.getDefaultInstance();
            return this;
          }
          
          // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.AddLog addLog = 3;
          public boolean hasAddLog() {
            return result.hasAddLog();
          }
          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog getAddLog() {
            return result.getAddLog();
          }
          public Builder setAddLog(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog value) {
            if (value == null) {
              throw new NullPointerException();
            }
            result.hasAddLog = true;
            result.addLog_ = value;
            return this;
          }
          public Builder setAddLog(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.Builder builderForValue) {
            result.hasAddLog = true;
            result.addLog_ = builderForValue.build();
            return this;
          }
          public Builder mergeAddLog(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog value) {
            if (result.hasAddLog() &&
                result.addLog_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.getDefaultInstance()) {
              result.addLog_ =
                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.newBuilder(result.addLog_).mergeFrom(value).buildPartial();
            } else {
              result.addLog_ = value;
            }
            result.hasAddLog = true;
            return this;
          }
          public Builder clearAddLog() {
            result.hasAddLog = false;
            result.addLog_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.getDefaultInstance();
            return this;
          }
          
          // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.AddLogBranch addLogBranch = 4;
          public boolean hasAddLogBranch() {
            return result.hasAddLogBranch();
          }
          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch getAddLogBranch() {
            return result.getAddLogBranch();
          }
          public Builder setAddLogBranch(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch value) {
            if (value == null) {
              throw new NullPointerException();
            }
            result.hasAddLogBranch = true;
            result.addLogBranch_ = value;
            return this;
          }
          public Builder setAddLogBranch(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch.Builder builderForValue) {
            result.hasAddLogBranch = true;
            result.addLogBranch_ = builderForValue.build();
            return this;
          }
          public Builder mergeAddLogBranch(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch value) {
            if (result.hasAddLogBranch() &&
                result.addLogBranch_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch.getDefaultInstance()) {
              result.addLogBranch_ =
                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch.newBuilder(result.addLogBranch_).mergeFrom(value).buildPartial();
            } else {
              result.addLogBranch_ = value;
            }
            result.hasAddLogBranch = true;
            return this;
          }
          public Builder clearAddLogBranch() {
            result.hasAddLogBranch = false;
            result.addLogBranch_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch.getDefaultInstance();
            return this;
          }
          
          // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.AddLogEntry addLogEntry = 5;
          public boolean hasAddLogEntry() {
            return result.hasAddLogEntry();
          }
          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry getAddLogEntry() {
            return result.getAddLogEntry();
          }
          public Builder setAddLogEntry(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry value) {
            if (value == null) {
              throw new NullPointerException();
            }
            result.hasAddLogEntry = true;
            result.addLogEntry_ = value;
            return this;
          }
          public Builder setAddLogEntry(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry.Builder builderForValue) {
            result.hasAddLogEntry = true;
            result.addLogEntry_ = builderForValue.build();
            return this;
          }
          public Builder mergeAddLogEntry(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry value) {
            if (result.hasAddLogEntry() &&
                result.addLogEntry_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry.getDefaultInstance()) {
              result.addLogEntry_ =
                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry.newBuilder(result.addLogEntry_).mergeFrom(value).buildPartial();
            } else {
              result.addLogEntry_ = value;
            }
            result.hasAddLogEntry = true;
            return this;
          }
          public Builder clearAddLogEntry() {
            result.hasAddLogEntry = false;
            result.addLogEntry_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry.getDefaultInstance();
            return this;
          }
          
          // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.DisconnectLog disconnectLog = 6;
          public boolean hasDisconnectLog() {
            return result.hasDisconnectLog();
          }
          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog getDisconnectLog() {
            return result.getDisconnectLog();
          }
          public Builder setDisconnectLog(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog value) {
            if (value == null) {
              throw new NullPointerException();
            }
            result.hasDisconnectLog = true;
            result.disconnectLog_ = value;
            return this;
          }
          public Builder setDisconnectLog(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog.Builder builderForValue) {
            result.hasDisconnectLog = true;
            result.disconnectLog_ = builderForValue.build();
            return this;
          }
          public Builder mergeDisconnectLog(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog value) {
            if (result.hasDisconnectLog() &&
                result.disconnectLog_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog.getDefaultInstance()) {
              result.disconnectLog_ =
                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog.newBuilder(result.disconnectLog_).mergeFrom(value).buildPartial();
            } else {
              result.disconnectLog_ = value;
            }
            result.hasDisconnectLog = true;
            return this;
          }
          public Builder clearDisconnectLog() {
            result.hasDisconnectLog = false;
            result.disconnectLog_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog.getDefaultInstance();
            return this;
          }
          
          // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.Initialize initialize = 7;
          public boolean hasInitialize() {
            return result.hasInitialize();
          }
          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Initialize getInitialize() {
            return result.getInitialize();
          }
          public Builder setInitialize(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Initialize value) {
            if (value == null) {
              throw new NullPointerException();
            }
            result.hasInitialize = true;
            result.initialize_ = value;
            return this;
          }
          public Builder setInitialize(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Initialize.Builder builderForValue) {
            result.hasInitialize = true;
            result.initialize_ = builderForValue.build();
            return this;
          }
          public Builder mergeInitialize(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Initialize value) {
            if (result.hasInitialize() &&
                result.initialize_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Initialize.getDefaultInstance()) {
              result.initialize_ =
                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Initialize.newBuilder(result.initialize_).mergeFrom(value).buildPartial();
            } else {
              result.initialize_ = value;
            }
            result.hasInitialize = true;
            return this;
          }
          public Builder clearInitialize() {
            result.hasInitialize = false;
            result.initialize_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Initialize.getDefaultInstance();
            return this;
          }
        }
        
        static {
          com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
        }
        
        static {
          com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
        }
      }
      
      public static final class DevModeRequest extends
          com.google.gwt.dev.protobuf.GeneratedMessage {
        // Use DevModeRequest.newBuilder() to construct.
        private DevModeRequest() {}
        
        private static final DevModeRequest defaultInstance = new DevModeRequest();
        public static DevModeRequest getDefaultInstance() {
          return defaultInstance;
        }
        
        public DevModeRequest getDefaultInstanceForType() {
          return defaultInstance;
        }
        
        public static final com.google.gwt.dev.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_descriptor;
        }
        
        protected com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_fieldAccessorTable;
        }
        
        public enum RequestType
            implements com.google.gwt.dev.protobuf.ProtocolMessageEnum {
          CAPABILITY_EXCHANGE(0, 0),
          RESTART_WEB_SERVER(1, 1),
          ;
          
          
          public final int getNumber() { return value; }
          
          public static RequestType valueOf(int value) {
            switch (value) {
              case 0: return CAPABILITY_EXCHANGE;
              case 1: return RESTART_WEB_SERVER;
              default: return null;
            }
          }
          
          public static com.google.gwt.dev.protobuf.Internal.EnumLiteMap<RequestType>
              internalGetValueMap() {
            return internalValueMap;
          }
          private static com.google.gwt.dev.protobuf.Internal.EnumLiteMap<RequestType>
              internalValueMap =
                new com.google.gwt.dev.protobuf.Internal.EnumLiteMap<RequestType>() {
                  public RequestType findValueByNumber(int number) {
                    return RequestType.valueOf(number)
          ;        }
                };
          
          public final com.google.gwt.dev.protobuf.Descriptors.EnumValueDescriptor
              getValueDescriptor() {
            return getDescriptor().getValues().get(index);
          }
          public final com.google.gwt.dev.protobuf.Descriptors.EnumDescriptor
              getDescriptorForType() {
            return getDescriptor();
          }
          public static final com.google.gwt.dev.protobuf.Descriptors.EnumDescriptor
              getDescriptor() {
            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.getDescriptor().getEnumTypes().get(0);
          }
          
          private static final RequestType[] VALUES = {
            CAPABILITY_EXCHANGE, RESTART_WEB_SERVER, 
          };
          public static RequestType valueOf(
              com.google.gwt.dev.protobuf.Descriptors.EnumValueDescriptor desc) {
            if (desc.getType() != getDescriptor()) {
              throw new java.lang.IllegalArgumentException(
                "EnumValueDescriptor is not for this type.");
            }
            return VALUES[desc.getIndex()];
          }
          private final int index;
          private final int value;
          private RequestType(int index, int value) {
            this.index = index;
            this.value = value;
          }
          
          static {
            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
          }
        }
        
        public static final class CapabilityExchange extends
            com.google.gwt.dev.protobuf.GeneratedMessage {
          // Use CapabilityExchange.newBuilder() to construct.
          private CapabilityExchange() {}
          
          private static final CapabilityExchange defaultInstance = new CapabilityExchange();
          public static CapabilityExchange getDefaultInstance() {
            return defaultInstance;
          }
          
          public CapabilityExchange getDefaultInstanceForType() {
            return defaultInstance;
          }
          
          public static final com.google.gwt.dev.protobuf.Descriptors.Descriptor
              getDescriptor() {
            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_CapabilityExchange_descriptor;
          }
          
          protected com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
              internalGetFieldAccessorTable() {
            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_CapabilityExchange_fieldAccessorTable;
          }
          
          public final boolean isInitialized() {
            return true;
          }
          
          public void writeTo(com.google.gwt.dev.protobuf.CodedOutputStream output)
                              throws java.io.IOException {
            getUnknownFields().writeTo(output);
          }
          
          private int memoizedSerializedSize = -1;
          public int getSerializedSize() {
            int size = memoizedSerializedSize;
            if (size != -1) return size;
          
            size = 0;
            size += getUnknownFields().getSerializedSize();
            memoizedSerializedSize = size;
            return size;
          }
          
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange parseFrom(
              com.google.gwt.dev.protobuf.ByteString data)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange parseFrom(
              com.google.gwt.dev.protobuf.ByteString data,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange parseFrom(byte[] data)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange parseFrom(
              byte[] data,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange parseFrom(java.io.InputStream input)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange parseFrom(
              java.io.InputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange parseDelimitedFrom(java.io.InputStream input)
              throws java.io.IOException {
            return newBuilder().mergeDelimitedFrom(input).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange parseDelimitedFrom(
              java.io.InputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange parseFrom(
              com.google.gwt.dev.protobuf.CodedInputStream input)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange parseFrom(
              com.google.gwt.dev.protobuf.CodedInputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input, extensionRegistry)
                     .buildParsed();
          }
          
          public static Builder newBuilder() { return Builder.create(); }
          public Builder newBuilderForType() { return newBuilder(); }
          public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange prototype) {
            return newBuilder().mergeFrom(prototype);
          }
          public Builder toBuilder() { return newBuilder(this); }
          
          public static final class Builder extends
              com.google.gwt.dev.protobuf.GeneratedMessage.Builder<Builder> {
            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange result;
            
            // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange.newBuilder()
            private Builder() {}
            
            private static Builder create() {
              Builder builder = new Builder();
              builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange();
              return builder;
            }
            
            protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange internalGetResult() {
              return result;
            }
            
            public Builder clear() {
              if (result == null) {
                throw new IllegalStateException(
                  "Cannot call clear() after build().");
              }
              result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange();
              return this;
            }
            
            public Builder clone() {
              return create().mergeFrom(result);
            }
            
            public com.google.gwt.dev.protobuf.Descriptors.Descriptor
                getDescriptorForType() {
              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange.getDescriptor();
            }
            
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange getDefaultInstanceForType() {
              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange.getDefaultInstance();
            }
            
            public boolean isInitialized() {
              return result.isInitialized();
            }
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange build() {
              if (result != null && !isInitialized()) {
                throw newUninitializedMessageException(result);
              }
              return buildPartial();
            }
            
            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange buildParsed()
                throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
              if (!isInitialized()) {
                throw newUninitializedMessageException(
                  result).asInvalidProtocolBufferException();
              }
              return buildPartial();
            }
            
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange buildPartial() {
              if (result == null) {
                throw new IllegalStateException(
                  "build() has already been called on this Builder.");
              }
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange returnMe = result;
              result = null;
              return returnMe;
            }
            
            public Builder mergeFrom(com.google.gwt.dev.protobuf.Message other) {
              if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange) {
                return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange)other);
              } else {
                super.mergeFrom(other);
                return this;
              }
            }
            
            public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange other) {
              if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange.getDefaultInstance()) return this;
              this.mergeUnknownFields(other.getUnknownFields());
              return this;
            }
            
            public Builder mergeFrom(
                com.google.gwt.dev.protobuf.CodedInputStream input,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws java.io.IOException {
              com.google.gwt.dev.protobuf.UnknownFieldSet.Builder unknownFields =
                com.google.gwt.dev.protobuf.UnknownFieldSet.newBuilder(
                  this.getUnknownFields());
              while (true) {
                int tag = input.readTag();
                switch (tag) {
                  case 0:
                    this.setUnknownFields(unknownFields.build());
                    return this;
                  default: {
                    if (!parseUnknownField(input, unknownFields,
                                           extensionRegistry, tag)) {
                      this.setUnknownFields(unknownFields.build());
                      return this;
                    }
                    break;
                  }
                }
              }
            }
            
          }
          
          static {
            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
          }
          
          static {
            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
          }
        }
        
        public static final class RestartWebServer extends
            com.google.gwt.dev.protobuf.GeneratedMessage {
          // Use RestartWebServer.newBuilder() to construct.
          private RestartWebServer() {}
          
          private static final RestartWebServer defaultInstance = new RestartWebServer();
          public static RestartWebServer getDefaultInstance() {
            return defaultInstance;
          }
          
          public RestartWebServer getDefaultInstanceForType() {
            return defaultInstance;
          }
          
          public static final com.google.gwt.dev.protobuf.Descriptors.Descriptor
              getDescriptor() {
            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_RestartWebServer_descriptor;
          }
          
          protected com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
              internalGetFieldAccessorTable() {
            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_RestartWebServer_fieldAccessorTable;
          }
          
          public final boolean isInitialized() {
            return true;
          }
          
          public void writeTo(com.google.gwt.dev.protobuf.CodedOutputStream output)
                              throws java.io.IOException {
            getUnknownFields().writeTo(output);
          }
          
          private int memoizedSerializedSize = -1;
          public int getSerializedSize() {
            int size = memoizedSerializedSize;
            if (size != -1) return size;
          
            size = 0;
            size += getUnknownFields().getSerializedSize();
            memoizedSerializedSize = size;
            return size;
          }
          
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer parseFrom(
              com.google.gwt.dev.protobuf.ByteString data)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer parseFrom(
              com.google.gwt.dev.protobuf.ByteString data,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer parseFrom(byte[] data)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer parseFrom(
              byte[] data,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer parseFrom(java.io.InputStream input)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer parseFrom(
              java.io.InputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer parseDelimitedFrom(java.io.InputStream input)
              throws java.io.IOException {
            return newBuilder().mergeDelimitedFrom(input).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer parseDelimitedFrom(
              java.io.InputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer parseFrom(
              com.google.gwt.dev.protobuf.CodedInputStream input)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer parseFrom(
              com.google.gwt.dev.protobuf.CodedInputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input, extensionRegistry)
                     .buildParsed();
          }
          
          public static Builder newBuilder() { return Builder.create(); }
          public Builder newBuilderForType() { return newBuilder(); }
          public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer prototype) {
            return newBuilder().mergeFrom(prototype);
          }
          public Builder toBuilder() { return newBuilder(this); }
          
          public static final class Builder extends
              com.google.gwt.dev.protobuf.GeneratedMessage.Builder<Builder> {
            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer result;
            
            // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer.newBuilder()
            private Builder() {}
            
            private static Builder create() {
              Builder builder = new Builder();
              builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer();
              return builder;
            }
            
            protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer internalGetResult() {
              return result;
            }
            
            public Builder clear() {
              if (result == null) {
                throw new IllegalStateException(
                  "Cannot call clear() after build().");
              }
              result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer();
              return this;
            }
            
            public Builder clone() {
              return create().mergeFrom(result);
            }
            
            public com.google.gwt.dev.protobuf.Descriptors.Descriptor
                getDescriptorForType() {
              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer.getDescriptor();
            }
            
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer getDefaultInstanceForType() {
              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer.getDefaultInstance();
            }
            
            public boolean isInitialized() {
              return result.isInitialized();
            }
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer build() {
              if (result != null && !isInitialized()) {
                throw newUninitializedMessageException(result);
              }
              return buildPartial();
            }
            
            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer buildParsed()
                throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
              if (!isInitialized()) {
                throw newUninitializedMessageException(
                  result).asInvalidProtocolBufferException();
              }
              return buildPartial();
            }
            
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer buildPartial() {
              if (result == null) {
                throw new IllegalStateException(
                  "build() has already been called on this Builder.");
              }
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer returnMe = result;
              result = null;
              return returnMe;
            }
            
            public Builder mergeFrom(com.google.gwt.dev.protobuf.Message other) {
              if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer) {
                return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer)other);
              } else {
                super.mergeFrom(other);
                return this;
              }
            }
            
            public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer other) {
              if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer.getDefaultInstance()) return this;
              this.mergeUnknownFields(other.getUnknownFields());
              return this;
            }
            
            public Builder mergeFrom(
                com.google.gwt.dev.protobuf.CodedInputStream input,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws java.io.IOException {
              com.google.gwt.dev.protobuf.UnknownFieldSet.Builder unknownFields =
                com.google.gwt.dev.protobuf.UnknownFieldSet.newBuilder(
                  this.getUnknownFields());
              while (true) {
                int tag = input.readTag();
                switch (tag) {
                  case 0:
                    this.setUnknownFields(unknownFields.build());
                    return this;
                  default: {
                    if (!parseUnknownField(input, unknownFields,
                                           extensionRegistry, tag)) {
                      this.setUnknownFields(unknownFields.build());
                      return this;
                    }
                    break;
                  }
                }
              }
            }
            
          }
          
          static {
            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
          }
          
          static {
            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
          }
        }
        
        // optional .com.google.gwt.dev.shell.remoteui.Message.Request.DevModeRequest.RequestType requestType = 1;
        public static final int REQUESTTYPE_FIELD_NUMBER = 1;
        private boolean hasRequestType;
        private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RequestType requestType_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RequestType.CAPABILITY_EXCHANGE;
        public boolean hasRequestType() { return hasRequestType; }
        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RequestType getRequestType() { return requestType_; }
        
        // optional .com.google.gwt.dev.shell.remoteui.Message.Request.DevModeRequest.CapabilityExchange capabilityExchange = 2;
        public static final int CAPABILITYEXCHANGE_FIELD_NUMBER = 2;
        private boolean hasCapabilityExchange;
        private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange capabilityExchange_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange.getDefaultInstance();
        public boolean hasCapabilityExchange() { return hasCapabilityExchange; }
        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange getCapabilityExchange() { return capabilityExchange_; }
        
        // optional .com.google.gwt.dev.shell.remoteui.Message.Request.DevModeRequest.RestartWebServer restartWebServer = 3;
        public static final int RESTARTWEBSERVER_FIELD_NUMBER = 3;
        private boolean hasRestartWebServer;
        private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer restartWebServer_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer.getDefaultInstance();
        public boolean hasRestartWebServer() { return hasRestartWebServer; }
        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer getRestartWebServer() { return restartWebServer_; }
        
        public final boolean isInitialized() {
          return true;
        }
        
        public void writeTo(com.google.gwt.dev.protobuf.CodedOutputStream output)
                            throws java.io.IOException {
          if (hasRequestType()) {
            output.writeEnum(1, getRequestType().getNumber());
          }
          if (hasCapabilityExchange()) {
            output.writeMessage(2, getCapabilityExchange());
          }
          if (hasRestartWebServer()) {
            output.writeMessage(3, getRestartWebServer());
          }
          getUnknownFields().writeTo(output);
        }
        
        private int memoizedSerializedSize = -1;
        public int getSerializedSize() {
          int size = memoizedSerializedSize;
          if (size != -1) return size;
        
          size = 0;
          if (hasRequestType()) {
            size += com.google.gwt.dev.protobuf.CodedOutputStream
              .computeEnumSize(1, getRequestType().getNumber());
          }
          if (hasCapabilityExchange()) {
            size += com.google.gwt.dev.protobuf.CodedOutputStream
              .computeMessageSize(2, getCapabilityExchange());
          }
          if (hasRestartWebServer()) {
            size += com.google.gwt.dev.protobuf.CodedOutputStream
              .computeMessageSize(3, getRestartWebServer());
          }
          size += getUnknownFields().getSerializedSize();
          memoizedSerializedSize = size;
          return size;
        }
        
        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest parseFrom(
            com.google.gwt.dev.protobuf.ByteString data)
            throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
          return newBuilder().mergeFrom(data).buildParsed();
        }
        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest parseFrom(
            com.google.gwt.dev.protobuf.ByteString data,
            com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
          return newBuilder().mergeFrom(data, extensionRegistry)
                   .buildParsed();
        }
        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest parseFrom(byte[] data)
            throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
          return newBuilder().mergeFrom(data).buildParsed();
        }
        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest parseFrom(
            byte[] data,
            com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
          return newBuilder().mergeFrom(data, extensionRegistry)
                   .buildParsed();
        }
        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest parseFrom(java.io.InputStream input)
            throws java.io.IOException {
          return newBuilder().mergeFrom(input).buildParsed();
        }
        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest parseFrom(
            java.io.InputStream input,
            com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          return newBuilder().mergeFrom(input, extensionRegistry)
                   .buildParsed();
        }
        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest parseDelimitedFrom(java.io.InputStream input)
            throws java.io.IOException {
          return newBuilder().mergeDelimitedFrom(input).buildParsed();
        }
        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest parseDelimitedFrom(
            java.io.InputStream input,
            com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
                   .buildParsed();
        }
        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest parseFrom(
            com.google.gwt.dev.protobuf.CodedInputStream input)
            throws java.io.IOException {
          return newBuilder().mergeFrom(input).buildParsed();
        }
        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest parseFrom(
            com.google.gwt.dev.protobuf.CodedInputStream input,
            com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          return newBuilder().mergeFrom(input, extensionRegistry)
                   .buildParsed();
        }
        
        public static Builder newBuilder() { return Builder.create(); }
        public Builder newBuilderForType() { return newBuilder(); }
        public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest prototype) {
          return newBuilder().mergeFrom(prototype);
        }
        public Builder toBuilder() { return newBuilder(this); }
        
        public static final class Builder extends
            com.google.gwt.dev.protobuf.GeneratedMessage.Builder<Builder> {
          private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest result;
          
          // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.newBuilder()
          private Builder() {}
          
          private static Builder create() {
            Builder builder = new Builder();
            builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest();
            return builder;
          }
          
          protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest internalGetResult() {
            return result;
          }
          
          public Builder clear() {
            if (result == null) {
              throw new IllegalStateException(
                "Cannot call clear() after build().");
            }
            result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest();
            return this;
          }
          
          public Builder clone() {
            return create().mergeFrom(result);
          }
          
          public com.google.gwt.dev.protobuf.Descriptors.Descriptor
              getDescriptorForType() {
            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.getDescriptor();
          }
          
          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest getDefaultInstanceForType() {
            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.getDefaultInstance();
          }
          
          public boolean isInitialized() {
            return result.isInitialized();
          }
          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest build() {
            if (result != null && !isInitialized()) {
              throw newUninitializedMessageException(result);
            }
            return buildPartial();
          }
          
          private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest buildParsed()
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            if (!isInitialized()) {
              throw newUninitializedMessageException(
                result).asInvalidProtocolBufferException();
            }
            return buildPartial();
          }
          
          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest buildPartial() {
            if (result == null) {
              throw new IllegalStateException(
                "build() has already been called on this Builder.");
            }
            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest returnMe = result;
            result = null;
            return returnMe;
          }
          
          public Builder mergeFrom(com.google.gwt.dev.protobuf.Message other) {
            if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest) {
              return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest)other);
            } else {
              super.mergeFrom(other);
              return this;
            }
          }
          
          public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest other) {
            if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.getDefaultInstance()) return this;
            if (other.hasRequestType()) {
              setRequestType(other.getRequestType());
            }
            if (other.hasCapabilityExchange()) {
              mergeCapabilityExchange(other.getCapabilityExchange());
            }
            if (other.hasRestartWebServer()) {
              mergeRestartWebServer(other.getRestartWebServer());
            }
            this.mergeUnknownFields(other.getUnknownFields());
            return this;
          }
          
          public Builder mergeFrom(
              com.google.gwt.dev.protobuf.CodedInputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            com.google.gwt.dev.protobuf.UnknownFieldSet.Builder unknownFields =
              com.google.gwt.dev.protobuf.UnknownFieldSet.newBuilder(
                this.getUnknownFields());
            while (true) {
              int tag = input.readTag();
              switch (tag) {
                case 0:
                  this.setUnknownFields(unknownFields.build());
                  return this;
                default: {
                  if (!parseUnknownField(input, unknownFields,
                                         extensionRegistry, tag)) {
                    this.setUnknownFields(unknownFields.build());
                    return this;
                  }
                  break;
                }
                case 8: {
                  int rawValue = input.readEnum();
                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RequestType value = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RequestType.valueOf(rawValue);
                  if (value == null) {
                    unknownFields.mergeVarintField(1, rawValue);
                  } else {
                    setRequestType(value);
                  }
                  break;
                }
                case 18: {
                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange.newBuilder();
                  if (hasCapabilityExchange()) {
                    subBuilder.mergeFrom(getCapabilityExchange());
                  }
                  input.readMessage(subBuilder, extensionRegistry);
                  setCapabilityExchange(subBuilder.buildPartial());
                  break;
                }
                case 26: {
                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer.newBuilder();
                  if (hasRestartWebServer()) {
                    subBuilder.mergeFrom(getRestartWebServer());
                  }
                  input.readMessage(subBuilder, extensionRegistry);
                  setRestartWebServer(subBuilder.buildPartial());
                  break;
                }
              }
            }
          }
          
          
          // optional .com.google.gwt.dev.shell.remoteui.Message.Request.DevModeRequest.RequestType requestType = 1;
          public boolean hasRequestType() {
            return result.hasRequestType();
          }
          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RequestType getRequestType() {
            return result.getRequestType();
          }
          public Builder setRequestType(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RequestType value) {
            if (value == null) {
              throw new NullPointerException();
            }
            result.hasRequestType = true;
            result.requestType_ = value;
            return this;
          }
          public Builder clearRequestType() {
            result.hasRequestType = false;
            result.requestType_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RequestType.CAPABILITY_EXCHANGE;
            return this;
          }
          
          // optional .com.google.gwt.dev.shell.remoteui.Message.Request.DevModeRequest.CapabilityExchange capabilityExchange = 2;
          public boolean hasCapabilityExchange() {
            return result.hasCapabilityExchange();
          }
          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange getCapabilityExchange() {
            return result.getCapabilityExchange();
          }
          public Builder setCapabilityExchange(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange value) {
            if (value == null) {
              throw new NullPointerException();
            }
            result.hasCapabilityExchange = true;
            result.capabilityExchange_ = value;
            return this;
          }
          public Builder setCapabilityExchange(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange.Builder builderForValue) {
            result.hasCapabilityExchange = true;
            result.capabilityExchange_ = builderForValue.build();
            return this;
          }
          public Builder mergeCapabilityExchange(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange value) {
            if (result.hasCapabilityExchange() &&
                result.capabilityExchange_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange.getDefaultInstance()) {
              result.capabilityExchange_ =
                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange.newBuilder(result.capabilityExchange_).mergeFrom(value).buildPartial();
            } else {
              result.capabilityExchange_ = value;
            }
            result.hasCapabilityExchange = true;
            return this;
          }
          public Builder clearCapabilityExchange() {
            result.hasCapabilityExchange = false;
            result.capabilityExchange_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange.getDefaultInstance();
            return this;
          }
          
          // optional .com.google.gwt.dev.shell.remoteui.Message.Request.DevModeRequest.RestartWebServer restartWebServer = 3;
          public boolean hasRestartWebServer() {
            return result.hasRestartWebServer();
          }
          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer getRestartWebServer() {
            return result.getRestartWebServer();
          }
          public Builder setRestartWebServer(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer value) {
            if (value == null) {
              throw new NullPointerException();
            }
            result.hasRestartWebServer = true;
            result.restartWebServer_ = value;
            return this;
          }
          public Builder setRestartWebServer(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer.Builder builderForValue) {
            result.hasRestartWebServer = true;
            result.restartWebServer_ = builderForValue.build();
            return this;
          }
          public Builder mergeRestartWebServer(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer value) {
            if (result.hasRestartWebServer() &&
                result.restartWebServer_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer.getDefaultInstance()) {
              result.restartWebServer_ =
                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer.newBuilder(result.restartWebServer_).mergeFrom(value).buildPartial();
            } else {
              result.restartWebServer_ = value;
            }
            result.hasRestartWebServer = true;
            return this;
          }
          public Builder clearRestartWebServer() {
            result.hasRestartWebServer = false;
            result.restartWebServer_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer.getDefaultInstance();
            return this;
          }
        }
        
        static {
          com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
        }
        
        static {
          com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
        }
      }
      
      // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ServiceType serviceType = 1;
      public static final int SERVICETYPE_FIELD_NUMBER = 1;
      private boolean hasServiceType;
      private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ServiceType serviceType_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ServiceType.VIEWER;
      public boolean hasServiceType() { return hasServiceType; }
      public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ServiceType getServiceType() { return serviceType_; }
      
      // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest viewerRequest = 2;
      public static final int VIEWERREQUEST_FIELD_NUMBER = 2;
      private boolean hasViewerRequest;
      private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest viewerRequest_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.getDefaultInstance();
      public boolean hasViewerRequest() { return hasViewerRequest; }
      public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest getViewerRequest() { return viewerRequest_; }
      
      // optional .com.google.gwt.dev.shell.remoteui.Message.Request.DevModeRequest devModeRequest = 3;
      public static final int DEVMODEREQUEST_FIELD_NUMBER = 3;
      private boolean hasDevModeRequest;
      private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest devModeRequest_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.getDefaultInstance();
      public boolean hasDevModeRequest() { return hasDevModeRequest; }
      public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest getDevModeRequest() { return devModeRequest_; }
      
      public final boolean isInitialized() {
        if (hasViewerRequest()) {
          if (!getViewerRequest().isInitialized()) return false;
        }
        return true;
      }
      
      public void writeTo(com.google.gwt.dev.protobuf.CodedOutputStream output)
                          throws java.io.IOException {
        if (hasServiceType()) {
          output.writeEnum(1, getServiceType().getNumber());
        }
        if (hasViewerRequest()) {
          output.writeMessage(2, getViewerRequest());
        }
        if (hasDevModeRequest()) {
          output.writeMessage(3, getDevModeRequest());
        }
        getUnknownFields().writeTo(output);
      }
      
      private int memoizedSerializedSize = -1;
      public int getSerializedSize() {
        int size = memoizedSerializedSize;
        if (size != -1) return size;
      
        size = 0;
        if (hasServiceType()) {
          size += com.google.gwt.dev.protobuf.CodedOutputStream
            .computeEnumSize(1, getServiceType().getNumber());
        }
        if (hasViewerRequest()) {
          size += com.google.gwt.dev.protobuf.CodedOutputStream
            .computeMessageSize(2, getViewerRequest());
        }
        if (hasDevModeRequest()) {
          size += com.google.gwt.dev.protobuf.CodedOutputStream
            .computeMessageSize(3, getDevModeRequest());
        }
        size += getUnknownFields().getSerializedSize();
        memoizedSerializedSize = size;
        return size;
      }
      
      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request parseFrom(
          com.google.gwt.dev.protobuf.ByteString data)
          throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
        return newBuilder().mergeFrom(data).buildParsed();
      }
      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request parseFrom(
          com.google.gwt.dev.protobuf.ByteString data,
          com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
        return newBuilder().mergeFrom(data, extensionRegistry)
                 .buildParsed();
      }
      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request parseFrom(byte[] data)
          throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
        return newBuilder().mergeFrom(data).buildParsed();
      }
      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request parseFrom(
          byte[] data,
          com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
        return newBuilder().mergeFrom(data, extensionRegistry)
                 .buildParsed();
      }
      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request parseFrom(java.io.InputStream input)
          throws java.io.IOException {
        return newBuilder().mergeFrom(input).buildParsed();
      }
      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request parseFrom(
          java.io.InputStream input,
          com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        return newBuilder().mergeFrom(input, extensionRegistry)
                 .buildParsed();
      }
      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request parseDelimitedFrom(java.io.InputStream input)
          throws java.io.IOException {
        return newBuilder().mergeDelimitedFrom(input).buildParsed();
      }
      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request parseDelimitedFrom(
          java.io.InputStream input,
          com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
                 .buildParsed();
      }
      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request parseFrom(
          com.google.gwt.dev.protobuf.CodedInputStream input)
          throws java.io.IOException {
        return newBuilder().mergeFrom(input).buildParsed();
      }
      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request parseFrom(
          com.google.gwt.dev.protobuf.CodedInputStream input,
          com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        return newBuilder().mergeFrom(input, extensionRegistry)
                 .buildParsed();
      }
      
      public static Builder newBuilder() { return Builder.create(); }
      public Builder newBuilderForType() { return newBuilder(); }
      public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request prototype) {
        return newBuilder().mergeFrom(prototype);
      }
      public Builder toBuilder() { return newBuilder(this); }
      
      public static final class Builder extends
          com.google.gwt.dev.protobuf.GeneratedMessage.Builder<Builder> {
        private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request result;
        
        // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.newBuilder()
        private Builder() {}
        
        private static Builder create() {
          Builder builder = new Builder();
          builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request();
          return builder;
        }
        
        protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request internalGetResult() {
          return result;
        }
        
        public Builder clear() {
          if (result == null) {
            throw new IllegalStateException(
              "Cannot call clear() after build().");
          }
          result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request();
          return this;
        }
        
        public Builder clone() {
          return create().mergeFrom(result);
        }
        
        public com.google.gwt.dev.protobuf.Descriptors.Descriptor
            getDescriptorForType() {
          return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.getDescriptor();
        }
        
        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request getDefaultInstanceForType() {
          return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.getDefaultInstance();
        }
        
        public boolean isInitialized() {
          return result.isInitialized();
        }
        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request build() {
          if (result != null && !isInitialized()) {
            throw newUninitializedMessageException(result);
          }
          return buildPartial();
        }
        
        private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request buildParsed()
            throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
          if (!isInitialized()) {
            throw newUninitializedMessageException(
              result).asInvalidProtocolBufferException();
          }
          return buildPartial();
        }
        
        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request buildPartial() {
          if (result == null) {
            throw new IllegalStateException(
              "build() has already been called on this Builder.");
          }
          com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request returnMe = result;
          result = null;
          return returnMe;
        }
        
        public Builder mergeFrom(com.google.gwt.dev.protobuf.Message other) {
          if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request) {
            return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request)other);
          } else {
            super.mergeFrom(other);
            return this;
          }
        }
        
        public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request other) {
          if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.getDefaultInstance()) return this;
          if (other.hasServiceType()) {
            setServiceType(other.getServiceType());
          }
          if (other.hasViewerRequest()) {
            mergeViewerRequest(other.getViewerRequest());
          }
          if (other.hasDevModeRequest()) {
            mergeDevModeRequest(other.getDevModeRequest());
          }
          this.mergeUnknownFields(other.getUnknownFields());
          return this;
        }
        
        public Builder mergeFrom(
            com.google.gwt.dev.protobuf.CodedInputStream input,
            com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          com.google.gwt.dev.protobuf.UnknownFieldSet.Builder unknownFields =
            com.google.gwt.dev.protobuf.UnknownFieldSet.newBuilder(
              this.getUnknownFields());
          while (true) {
            int tag = input.readTag();
            switch (tag) {
              case 0:
                this.setUnknownFields(unknownFields.build());
                return this;
              default: {
                if (!parseUnknownField(input, unknownFields,
                                       extensionRegistry, tag)) {
                  this.setUnknownFields(unknownFields.build());
                  return this;
                }
                break;
              }
              case 8: {
                int rawValue = input.readEnum();
                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ServiceType value = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ServiceType.valueOf(rawValue);
                if (value == null) {
                  unknownFields.mergeVarintField(1, rawValue);
                } else {
                  setServiceType(value);
                }
                break;
              }
              case 18: {
                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.newBuilder();
                if (hasViewerRequest()) {
                  subBuilder.mergeFrom(getViewerRequest());
                }
                input.readMessage(subBuilder, extensionRegistry);
                setViewerRequest(subBuilder.buildPartial());
                break;
              }
              case 26: {
                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.newBuilder();
                if (hasDevModeRequest()) {
                  subBuilder.mergeFrom(getDevModeRequest());
                }
                input.readMessage(subBuilder, extensionRegistry);
                setDevModeRequest(subBuilder.buildPartial());
                break;
              }
            }
          }
        }
        
        
        // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ServiceType serviceType = 1;
        public boolean hasServiceType() {
          return result.hasServiceType();
        }
        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ServiceType getServiceType() {
          return result.getServiceType();
        }
        public Builder setServiceType(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ServiceType value) {
          if (value == null) {
            throw new NullPointerException();
          }
          result.hasServiceType = true;
          result.serviceType_ = value;
          return this;
        }
        public Builder clearServiceType() {
          result.hasServiceType = false;
          result.serviceType_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ServiceType.VIEWER;
          return this;
        }
        
        // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest viewerRequest = 2;
        public boolean hasViewerRequest() {
          return result.hasViewerRequest();
        }
        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest getViewerRequest() {
          return result.getViewerRequest();
        }
        public Builder setViewerRequest(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest value) {
          if (value == null) {
            throw new NullPointerException();
          }
          result.hasViewerRequest = true;
          result.viewerRequest_ = value;
          return this;
        }
        public Builder setViewerRequest(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Builder builderForValue) {
          result.hasViewerRequest = true;
          result.viewerRequest_ = builderForValue.build();
          return this;
        }
        public Builder mergeViewerRequest(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest value) {
          if (result.hasViewerRequest() &&
              result.viewerRequest_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.getDefaultInstance()) {
            result.viewerRequest_ =
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.newBuilder(result.viewerRequest_).mergeFrom(value).buildPartial();
          } else {
            result.viewerRequest_ = value;
          }
          result.hasViewerRequest = true;
          return this;
        }
        public Builder clearViewerRequest() {
          result.hasViewerRequest = false;
          result.viewerRequest_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.getDefaultInstance();
          return this;
        }
        
        // optional .com.google.gwt.dev.shell.remoteui.Message.Request.DevModeRequest devModeRequest = 3;
        public boolean hasDevModeRequest() {
          return result.hasDevModeRequest();
        }
        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest getDevModeRequest() {
          return result.getDevModeRequest();
        }
        public Builder setDevModeRequest(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest value) {
          if (value == null) {
            throw new NullPointerException();
          }
          result.hasDevModeRequest = true;
          result.devModeRequest_ = value;
          return this;
        }
        public Builder setDevModeRequest(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.Builder builderForValue) {
          result.hasDevModeRequest = true;
          result.devModeRequest_ = builderForValue.build();
          return this;
        }
        public Builder mergeDevModeRequest(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest value) {
          if (result.hasDevModeRequest() &&
              result.devModeRequest_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.getDefaultInstance()) {
            result.devModeRequest_ =
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.newBuilder(result.devModeRequest_).mergeFrom(value).buildPartial();
          } else {
            result.devModeRequest_ = value;
          }
          result.hasDevModeRequest = true;
          return this;
        }
        public Builder clearDevModeRequest() {
          result.hasDevModeRequest = false;
          result.devModeRequest_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.getDefaultInstance();
          return this;
        }
      }
      
      static {
        com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
      }
      
      static {
        com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
      }
    }
    
    public static final class Response extends
        com.google.gwt.dev.protobuf.GeneratedMessage {
      // Use Response.newBuilder() to construct.
      private Response() {}
      
      private static final Response defaultInstance = new Response();
      public static Response getDefaultInstance() {
        return defaultInstance;
      }
      
      public Response getDefaultInstanceForType() {
        return defaultInstance;
      }
      
      public static final com.google.gwt.dev.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_descriptor;
      }
      
      protected com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_fieldAccessorTable;
      }
      
      public static final class ViewerResponse extends
          com.google.gwt.dev.protobuf.GeneratedMessage {
        // Use ViewerResponse.newBuilder() to construct.
        private ViewerResponse() {}
        
        private static final ViewerResponse defaultInstance = new ViewerResponse();
        public static ViewerResponse getDefaultInstance() {
          return defaultInstance;
        }
        
        public ViewerResponse getDefaultInstanceForType() {
          return defaultInstance;
        }
        
        public static final com.google.gwt.dev.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_descriptor;
        }
        
        protected com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_fieldAccessorTable;
        }
        
        public enum ResponseType
            implements com.google.gwt.dev.protobuf.ProtocolMessageEnum {
          CAPABILITY_EXCHANGE(0, 0),
          ADD_LOG(1, 1),
          ADD_LOG_BRANCH(2, 2),
          ;
          
          
          public final int getNumber() { return value; }
          
          public static ResponseType valueOf(int value) {
            switch (value) {
              case 0: return CAPABILITY_EXCHANGE;
              case 1: return ADD_LOG;
              case 2: return ADD_LOG_BRANCH;
              default: return null;
            }
          }
          
          public static com.google.gwt.dev.protobuf.Internal.EnumLiteMap<ResponseType>
              internalGetValueMap() {
            return internalValueMap;
          }
          private static com.google.gwt.dev.protobuf.Internal.EnumLiteMap<ResponseType>
              internalValueMap =
                new com.google.gwt.dev.protobuf.Internal.EnumLiteMap<ResponseType>() {
                  public ResponseType findValueByNumber(int number) {
                    return ResponseType.valueOf(number)
          ;        }
                };
          
          public final com.google.gwt.dev.protobuf.Descriptors.EnumValueDescriptor
              getValueDescriptor() {
            return getDescriptor().getValues().get(index);
          }
          public final com.google.gwt.dev.protobuf.Descriptors.EnumDescriptor
              getDescriptorForType() {
            return getDescriptor();
          }
          public static final com.google.gwt.dev.protobuf.Descriptors.EnumDescriptor
              getDescriptor() {
            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.getDescriptor().getEnumTypes().get(0);
          }
          
          private static final ResponseType[] VALUES = {
            CAPABILITY_EXCHANGE, ADD_LOG, ADD_LOG_BRANCH, 
          };
          public static ResponseType valueOf(
              com.google.gwt.dev.protobuf.Descriptors.EnumValueDescriptor desc) {
            if (desc.getType() != getDescriptor()) {
              throw new java.lang.IllegalArgumentException(
                "EnumValueDescriptor is not for this type.");
            }
            return VALUES[desc.getIndex()];
          }
          private final int index;
          private final int value;
          private ResponseType(int index, int value) {
            this.index = index;
            this.value = value;
          }
          
          static {
            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
          }
        }
        
        public static final class CapabilityExchange extends
            com.google.gwt.dev.protobuf.GeneratedMessage {
          // Use CapabilityExchange.newBuilder() to construct.
          private CapabilityExchange() {}
          
          private static final CapabilityExchange defaultInstance = new CapabilityExchange();
          public static CapabilityExchange getDefaultInstance() {
            return defaultInstance;
          }
          
          public CapabilityExchange getDefaultInstanceForType() {
            return defaultInstance;
          }
          
          public static final com.google.gwt.dev.protobuf.Descriptors.Descriptor
              getDescriptor() {
            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_CapabilityExchange_descriptor;
          }
          
          protected com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
              internalGetFieldAccessorTable() {
            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_CapabilityExchange_fieldAccessorTable;
          }
          
          public static final class Capability extends
              com.google.gwt.dev.protobuf.GeneratedMessage {
            // Use Capability.newBuilder() to construct.
            private Capability() {}
            
            private static final Capability defaultInstance = new Capability();
            public static Capability getDefaultInstance() {
              return defaultInstance;
            }
            
            public Capability getDefaultInstanceForType() {
              return defaultInstance;
            }
            
            public static final com.google.gwt.dev.protobuf.Descriptors.Descriptor
                getDescriptor() {
              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_CapabilityExchange_Capability_descriptor;
            }
            
            protected com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
                internalGetFieldAccessorTable() {
              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_CapabilityExchange_Capability_fieldAccessorTable;
            }
            
            // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.RequestType capability = 1;
            public static final int CAPABILITY_FIELD_NUMBER = 1;
            private boolean hasCapability;
            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.RequestType capability_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.RequestType.CAPABILITY_EXCHANGE;
            public boolean hasCapability() { return hasCapability; }
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.RequestType getCapability() { return capability_; }
            
            public final boolean isInitialized() {
              return true;
            }
            
            public void writeTo(com.google.gwt.dev.protobuf.CodedOutputStream output)
                                throws java.io.IOException {
              if (hasCapability()) {
                output.writeEnum(1, getCapability().getNumber());
              }
              getUnknownFields().writeTo(output);
            }
            
            private int memoizedSerializedSize = -1;
            public int getSerializedSize() {
              int size = memoizedSerializedSize;
              if (size != -1) return size;
            
              size = 0;
              if (hasCapability()) {
                size += com.google.gwt.dev.protobuf.CodedOutputStream
                  .computeEnumSize(1, getCapability().getNumber());
              }
              size += getUnknownFields().getSerializedSize();
              memoizedSerializedSize = size;
              return size;
            }
            
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability parseFrom(
                com.google.gwt.dev.protobuf.ByteString data)
                throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
              return newBuilder().mergeFrom(data).buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability parseFrom(
                com.google.gwt.dev.protobuf.ByteString data,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
              return newBuilder().mergeFrom(data, extensionRegistry)
                       .buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability parseFrom(byte[] data)
                throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
              return newBuilder().mergeFrom(data).buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability parseFrom(
                byte[] data,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
              return newBuilder().mergeFrom(data, extensionRegistry)
                       .buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability parseFrom(java.io.InputStream input)
                throws java.io.IOException {
              return newBuilder().mergeFrom(input).buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability parseFrom(
                java.io.InputStream input,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws java.io.IOException {
              return newBuilder().mergeFrom(input, extensionRegistry)
                       .buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability parseDelimitedFrom(java.io.InputStream input)
                throws java.io.IOException {
              return newBuilder().mergeDelimitedFrom(input).buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability parseDelimitedFrom(
                java.io.InputStream input,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws java.io.IOException {
              return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
                       .buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability parseFrom(
                com.google.gwt.dev.protobuf.CodedInputStream input)
                throws java.io.IOException {
              return newBuilder().mergeFrom(input).buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability parseFrom(
                com.google.gwt.dev.protobuf.CodedInputStream input,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws java.io.IOException {
              return newBuilder().mergeFrom(input, extensionRegistry)
                       .buildParsed();
            }
            
            public static Builder newBuilder() { return Builder.create(); }
            public Builder newBuilderForType() { return newBuilder(); }
            public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability prototype) {
              return newBuilder().mergeFrom(prototype);
            }
            public Builder toBuilder() { return newBuilder(this); }
            
            public static final class Builder extends
                com.google.gwt.dev.protobuf.GeneratedMessage.Builder<Builder> {
              private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability result;
              
              // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability.newBuilder()
              private Builder() {}
              
              private static Builder create() {
                Builder builder = new Builder();
                builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability();
                return builder;
              }
              
              protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability internalGetResult() {
                return result;
              }
              
              public Builder clear() {
                if (result == null) {
                  throw new IllegalStateException(
                    "Cannot call clear() after build().");
                }
                result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability();
                return this;
              }
              
              public Builder clone() {
                return create().mergeFrom(result);
              }
              
              public com.google.gwt.dev.protobuf.Descriptors.Descriptor
                  getDescriptorForType() {
                return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability.getDescriptor();
              }
              
              public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability getDefaultInstanceForType() {
                return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability.getDefaultInstance();
              }
              
              public boolean isInitialized() {
                return result.isInitialized();
              }
              public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability build() {
                if (result != null && !isInitialized()) {
                  throw newUninitializedMessageException(result);
                }
                return buildPartial();
              }
              
              private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability buildParsed()
                  throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
                if (!isInitialized()) {
                  throw newUninitializedMessageException(
                    result).asInvalidProtocolBufferException();
                }
                return buildPartial();
              }
              
              public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability buildPartial() {
                if (result == null) {
                  throw new IllegalStateException(
                    "build() has already been called on this Builder.");
                }
                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability returnMe = result;
                result = null;
                return returnMe;
              }
              
              public Builder mergeFrom(com.google.gwt.dev.protobuf.Message other) {
                if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability) {
                  return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability)other);
                } else {
                  super.mergeFrom(other);
                  return this;
                }
              }
              
              public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability other) {
                if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability.getDefaultInstance()) return this;
                if (other.hasCapability()) {
                  setCapability(other.getCapability());
                }
                this.mergeUnknownFields(other.getUnknownFields());
                return this;
              }
              
              public Builder mergeFrom(
                  com.google.gwt.dev.protobuf.CodedInputStream input,
                  com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                  throws java.io.IOException {
                com.google.gwt.dev.protobuf.UnknownFieldSet.Builder unknownFields =
                  com.google.gwt.dev.protobuf.UnknownFieldSet.newBuilder(
                    this.getUnknownFields());
                while (true) {
                  int tag = input.readTag();
                  switch (tag) {
                    case 0:
                      this.setUnknownFields(unknownFields.build());
                      return this;
                    default: {
                      if (!parseUnknownField(input, unknownFields,
                                             extensionRegistry, tag)) {
                        this.setUnknownFields(unknownFields.build());
                        return this;
                      }
                      break;
                    }
                    case 8: {
                      int rawValue = input.readEnum();
                      com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.RequestType value = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.RequestType.valueOf(rawValue);
                      if (value == null) {
                        unknownFields.mergeVarintField(1, rawValue);
                      } else {
                        setCapability(value);
                      }
                      break;
                    }
                  }
                }
              }
              
              
              // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.RequestType capability = 1;
              public boolean hasCapability() {
                return result.hasCapability();
              }
              public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.RequestType getCapability() {
                return result.getCapability();
              }
              public Builder setCapability(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.RequestType value) {
                if (value == null) {
                  throw new NullPointerException();
                }
                result.hasCapability = true;
                result.capability_ = value;
                return this;
              }
              public Builder clearCapability() {
                result.hasCapability = false;
                result.capability_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.RequestType.CAPABILITY_EXCHANGE;
                return this;
              }
            }
            
            static {
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
            }
            
            static {
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
            }
          }
          
          // repeated .com.google.gwt.dev.shell.remoteui.Message.Response.ViewerResponse.CapabilityExchange.Capability capabilities = 2;
          public static final int CAPABILITIES_FIELD_NUMBER = 2;
          private java.util.List<com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability> capabilities_ =
            java.util.Collections.emptyList();
          public java.util.List<com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability> getCapabilitiesList() {
            return capabilities_;
          }
          public int getCapabilitiesCount() { return capabilities_.size(); }
          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability getCapabilities(int index) {
            return capabilities_.get(index);
          }
          
          public final boolean isInitialized() {
            return true;
          }
          
          public void writeTo(com.google.gwt.dev.protobuf.CodedOutputStream output)
                              throws java.io.IOException {
            for (com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability element : getCapabilitiesList()) {
              output.writeMessage(2, element);
            }
            getUnknownFields().writeTo(output);
          }
          
          private int memoizedSerializedSize = -1;
          public int getSerializedSize() {
            int size = memoizedSerializedSize;
            if (size != -1) return size;
          
            size = 0;
            for (com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability element : getCapabilitiesList()) {
              size += com.google.gwt.dev.protobuf.CodedOutputStream
                .computeMessageSize(2, element);
            }
            size += getUnknownFields().getSerializedSize();
            memoizedSerializedSize = size;
            return size;
          }
          
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange parseFrom(
              com.google.gwt.dev.protobuf.ByteString data)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange parseFrom(
              com.google.gwt.dev.protobuf.ByteString data,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange parseFrom(byte[] data)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange parseFrom(
              byte[] data,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange parseFrom(java.io.InputStream input)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange parseFrom(
              java.io.InputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange parseDelimitedFrom(java.io.InputStream input)
              throws java.io.IOException {
            return newBuilder().mergeDelimitedFrom(input).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange parseDelimitedFrom(
              java.io.InputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange parseFrom(
              com.google.gwt.dev.protobuf.CodedInputStream input)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange parseFrom(
              com.google.gwt.dev.protobuf.CodedInputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input, extensionRegistry)
                     .buildParsed();
          }
          
          public static Builder newBuilder() { return Builder.create(); }
          public Builder newBuilderForType() { return newBuilder(); }
          public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange prototype) {
            return newBuilder().mergeFrom(prototype);
          }
          public Builder toBuilder() { return newBuilder(this); }
          
          public static final class Builder extends
              com.google.gwt.dev.protobuf.GeneratedMessage.Builder<Builder> {
            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange result;
            
            // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.newBuilder()
            private Builder() {}
            
            private static Builder create() {
              Builder builder = new Builder();
              builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange();
              return builder;
            }
            
            protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange internalGetResult() {
              return result;
            }
            
            public Builder clear() {
              if (result == null) {
                throw new IllegalStateException(
                  "Cannot call clear() after build().");
              }
              result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange();
              return this;
            }
            
            public Builder clone() {
              return create().mergeFrom(result);
            }
            
            public com.google.gwt.dev.protobuf.Descriptors.Descriptor
                getDescriptorForType() {
              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.getDescriptor();
            }
            
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange getDefaultInstanceForType() {
              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.getDefaultInstance();
            }
            
            public boolean isInitialized() {
              return result.isInitialized();
            }
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange build() {
              if (result != null && !isInitialized()) {
                throw newUninitializedMessageException(result);
              }
              return buildPartial();
            }
            
            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange buildParsed()
                throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
              if (!isInitialized()) {
                throw newUninitializedMessageException(
                  result).asInvalidProtocolBufferException();
              }
              return buildPartial();
            }
            
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange buildPartial() {
              if (result == null) {
                throw new IllegalStateException(
                  "build() has already been called on this Builder.");
              }
              if (result.capabilities_ != java.util.Collections.EMPTY_LIST) {
                result.capabilities_ =
                  java.util.Collections.unmodifiableList(result.capabilities_);
              }
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange returnMe = result;
              result = null;
              return returnMe;
            }
            
            public Builder mergeFrom(com.google.gwt.dev.protobuf.Message other) {
              if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange) {
                return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange)other);
              } else {
                super.mergeFrom(other);
                return this;
              }
            }
            
            public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange other) {
              if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.getDefaultInstance()) return this;
              if (!other.capabilities_.isEmpty()) {
                if (result.capabilities_.isEmpty()) {
                  result.capabilities_ = new java.util.ArrayList<com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability>();
                }
                result.capabilities_.addAll(other.capabilities_);
              }
              this.mergeUnknownFields(other.getUnknownFields());
              return this;
            }
            
            public Builder mergeFrom(
                com.google.gwt.dev.protobuf.CodedInputStream input,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws java.io.IOException {
              com.google.gwt.dev.protobuf.UnknownFieldSet.Builder unknownFields =
                com.google.gwt.dev.protobuf.UnknownFieldSet.newBuilder(
                  this.getUnknownFields());
              while (true) {
                int tag = input.readTag();
                switch (tag) {
                  case 0:
                    this.setUnknownFields(unknownFields.build());
                    return this;
                  default: {
                    if (!parseUnknownField(input, unknownFields,
                                           extensionRegistry, tag)) {
                      this.setUnknownFields(unknownFields.build());
                      return this;
                    }
                    break;
                  }
                  case 18: {
                    com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability.newBuilder();
                    input.readMessage(subBuilder, extensionRegistry);
                    addCapabilities(subBuilder.buildPartial());
                    break;
                  }
                }
              }
            }
            
            
            // repeated .com.google.gwt.dev.shell.remoteui.Message.Response.ViewerResponse.CapabilityExchange.Capability capabilities = 2;
            public java.util.List<com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability> getCapabilitiesList() {
              return java.util.Collections.unmodifiableList(result.capabilities_);
            }
            public int getCapabilitiesCount() {
              return result.getCapabilitiesCount();
            }
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability getCapabilities(int index) {
              return result.getCapabilities(index);
            }
            public Builder setCapabilities(int index, com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability value) {
              if (value == null) {
                throw new NullPointerException();
              }
              result.capabilities_.set(index, value);
              return this;
            }
            public Builder setCapabilities(int index, com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability.Builder builderForValue) {
              result.capabilities_.set(index, builderForValue.build());
              return this;
            }
            public Builder addCapabilities(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability value) {
              if (value == null) {
                throw new NullPointerException();
              }
              if (result.capabilities_.isEmpty()) {
                result.capabilities_ = new java.util.ArrayList<com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability>();
              }
              result.capabilities_.add(value);
              return this;
            }
            public Builder addCapabilities(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability.Builder builderForValue) {
              if (result.capabilities_.isEmpty()) {
                result.capabilities_ = new java.util.ArrayList<com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability>();
              }
              result.capabilities_.add(builderForValue.build());
              return this;
            }
            public Builder addAllCapabilities(
                java.lang.Iterable<? extends com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability> values) {
              if (result.capabilities_.isEmpty()) {
                result.capabilities_ = new java.util.ArrayList<com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability>();
              }
              super.addAll(values, result.capabilities_);
              return this;
            }
            public Builder clearCapabilities() {
              result.capabilities_ = java.util.Collections.emptyList();
              return this;
            }
          }
          
          static {
            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
          }
          
          static {
            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
          }
        }
        
        public static final class AddLog extends
            com.google.gwt.dev.protobuf.GeneratedMessage {
          // Use AddLog.newBuilder() to construct.
          private AddLog() {}
          
          private static final AddLog defaultInstance = new AddLog();
          public static AddLog getDefaultInstance() {
            return defaultInstance;
          }
          
          public AddLog getDefaultInstanceForType() {
            return defaultInstance;
          }
          
          public static final com.google.gwt.dev.protobuf.Descriptors.Descriptor
              getDescriptor() {
            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_AddLog_descriptor;
          }
          
          protected com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
              internalGetFieldAccessorTable() {
            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_AddLog_fieldAccessorTable;
          }
          
          // required uint32 logHandle = 1;
          public static final int LOGHANDLE_FIELD_NUMBER = 1;
          private boolean hasLogHandle;
          private int logHandle_ = 0;
          public boolean hasLogHandle() { return hasLogHandle; }
          public int getLogHandle() { return logHandle_; }
          
          public final boolean isInitialized() {
            if (!hasLogHandle) return false;
            return true;
          }
          
          public void writeTo(com.google.gwt.dev.protobuf.CodedOutputStream output)
                              throws java.io.IOException {
            if (hasLogHandle()) {
              output.writeUInt32(1, getLogHandle());
            }
            getUnknownFields().writeTo(output);
          }
          
          private int memoizedSerializedSize = -1;
          public int getSerializedSize() {
            int size = memoizedSerializedSize;
            if (size != -1) return size;
          
            size = 0;
            if (hasLogHandle()) {
              size += com.google.gwt.dev.protobuf.CodedOutputStream
                .computeUInt32Size(1, getLogHandle());
            }
            size += getUnknownFields().getSerializedSize();
            memoizedSerializedSize = size;
            return size;
          }
          
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog parseFrom(
              com.google.gwt.dev.protobuf.ByteString data)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog parseFrom(
              com.google.gwt.dev.protobuf.ByteString data,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog parseFrom(byte[] data)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog parseFrom(
              byte[] data,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog parseFrom(java.io.InputStream input)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog parseFrom(
              java.io.InputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog parseDelimitedFrom(java.io.InputStream input)
              throws java.io.IOException {
            return newBuilder().mergeDelimitedFrom(input).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog parseDelimitedFrom(
              java.io.InputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog parseFrom(
              com.google.gwt.dev.protobuf.CodedInputStream input)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog parseFrom(
              com.google.gwt.dev.protobuf.CodedInputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input, extensionRegistry)
                     .buildParsed();
          }
          
          public static Builder newBuilder() { return Builder.create(); }
          public Builder newBuilderForType() { return newBuilder(); }
          public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog prototype) {
            return newBuilder().mergeFrom(prototype);
          }
          public Builder toBuilder() { return newBuilder(this); }
          
          public static final class Builder extends
              com.google.gwt.dev.protobuf.GeneratedMessage.Builder<Builder> {
            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog result;
            
            // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog.newBuilder()
            private Builder() {}
            
            private static Builder create() {
              Builder builder = new Builder();
              builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog();
              return builder;
            }
            
            protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog internalGetResult() {
              return result;
            }
            
            public Builder clear() {
              if (result == null) {
                throw new IllegalStateException(
                  "Cannot call clear() after build().");
              }
              result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog();
              return this;
            }
            
            public Builder clone() {
              return create().mergeFrom(result);
            }
            
            public com.google.gwt.dev.protobuf.Descriptors.Descriptor
                getDescriptorForType() {
              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog.getDescriptor();
            }
            
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog getDefaultInstanceForType() {
              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog.getDefaultInstance();
            }
            
            public boolean isInitialized() {
              return result.isInitialized();
            }
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog build() {
              if (result != null && !isInitialized()) {
                throw newUninitializedMessageException(result);
              }
              return buildPartial();
            }
            
            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog buildParsed()
                throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
              if (!isInitialized()) {
                throw newUninitializedMessageException(
                  result).asInvalidProtocolBufferException();
              }
              return buildPartial();
            }
            
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog buildPartial() {
              if (result == null) {
                throw new IllegalStateException(
                  "build() has already been called on this Builder.");
              }
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog returnMe = result;
              result = null;
              return returnMe;
            }
            
            public Builder mergeFrom(com.google.gwt.dev.protobuf.Message other) {
              if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog) {
                return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog)other);
              } else {
                super.mergeFrom(other);
                return this;
              }
            }
            
            public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog other) {
              if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog.getDefaultInstance()) return this;
              if (other.hasLogHandle()) {
                setLogHandle(other.getLogHandle());
              }
              this.mergeUnknownFields(other.getUnknownFields());
              return this;
            }
            
            public Builder mergeFrom(
                com.google.gwt.dev.protobuf.CodedInputStream input,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws java.io.IOException {
              com.google.gwt.dev.protobuf.UnknownFieldSet.Builder unknownFields =
                com.google.gwt.dev.protobuf.UnknownFieldSet.newBuilder(
                  this.getUnknownFields());
              while (true) {
                int tag = input.readTag();
                switch (tag) {
                  case 0:
                    this.setUnknownFields(unknownFields.build());
                    return this;
                  default: {
                    if (!parseUnknownField(input, unknownFields,
                                           extensionRegistry, tag)) {
                      this.setUnknownFields(unknownFields.build());
                      return this;
                    }
                    break;
                  }
                  case 8: {
                    setLogHandle(input.readUInt32());
                    break;
                  }
                }
              }
            }
            
            
            // required uint32 logHandle = 1;
            public boolean hasLogHandle() {
              return result.hasLogHandle();
            }
            public int getLogHandle() {
              return result.getLogHandle();
            }
            public Builder setLogHandle(int value) {
              result.hasLogHandle = true;
              result.logHandle_ = value;
              return this;
            }
            public Builder clearLogHandle() {
              result.hasLogHandle = false;
              result.logHandle_ = 0;
              return this;
            }
          }
          
          static {
            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
          }
          
          static {
            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
          }
        }
        
        public static final class AddLogBranch extends
            com.google.gwt.dev.protobuf.GeneratedMessage {
          // Use AddLogBranch.newBuilder() to construct.
          private AddLogBranch() {}
          
          private static final AddLogBranch defaultInstance = new AddLogBranch();
          public static AddLogBranch getDefaultInstance() {
            return defaultInstance;
          }
          
          public AddLogBranch getDefaultInstanceForType() {
            return defaultInstance;
          }
          
          public static final com.google.gwt.dev.protobuf.Descriptors.Descriptor
              getDescriptor() {
            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_AddLogBranch_descriptor;
          }
          
          protected com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
              internalGetFieldAccessorTable() {
            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_AddLogBranch_fieldAccessorTable;
          }
          
          // required uint32 logHandle = 1;
          public static final int LOGHANDLE_FIELD_NUMBER = 1;
          private boolean hasLogHandle;
          private int logHandle_ = 0;
          public boolean hasLogHandle() { return hasLogHandle; }
          public int getLogHandle() { return logHandle_; }
          
          public final boolean isInitialized() {
            if (!hasLogHandle) return false;
            return true;
          }
          
          public void writeTo(com.google.gwt.dev.protobuf.CodedOutputStream output)
                              throws java.io.IOException {
            if (hasLogHandle()) {
              output.writeUInt32(1, getLogHandle());
            }
            getUnknownFields().writeTo(output);
          }
          
          private int memoizedSerializedSize = -1;
          public int getSerializedSize() {
            int size = memoizedSerializedSize;
            if (size != -1) return size;
          
            size = 0;
            if (hasLogHandle()) {
              size += com.google.gwt.dev.protobuf.CodedOutputStream
                .computeUInt32Size(1, getLogHandle());
            }
            size += getUnknownFields().getSerializedSize();
            memoizedSerializedSize = size;
            return size;
          }
          
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch parseFrom(
              com.google.gwt.dev.protobuf.ByteString data)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch parseFrom(
              com.google.gwt.dev.protobuf.ByteString data,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch parseFrom(byte[] data)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch parseFrom(
              byte[] data,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch parseFrom(java.io.InputStream input)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch parseFrom(
              java.io.InputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch parseDelimitedFrom(java.io.InputStream input)
              throws java.io.IOException {
            return newBuilder().mergeDelimitedFrom(input).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch parseDelimitedFrom(
              java.io.InputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch parseFrom(
              com.google.gwt.dev.protobuf.CodedInputStream input)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch parseFrom(
              com.google.gwt.dev.protobuf.CodedInputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input, extensionRegistry)
                     .buildParsed();
          }
          
          public static Builder newBuilder() { return Builder.create(); }
          public Builder newBuilderForType() { return newBuilder(); }
          public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch prototype) {
            return newBuilder().mergeFrom(prototype);
          }
          public Builder toBuilder() { return newBuilder(this); }
          
          public static final class Builder extends
              com.google.gwt.dev.protobuf.GeneratedMessage.Builder<Builder> {
            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch result;
            
            // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch.newBuilder()
            private Builder() {}
            
            private static Builder create() {
              Builder builder = new Builder();
              builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch();
              return builder;
            }
            
            protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch internalGetResult() {
              return result;
            }
            
            public Builder clear() {
              if (result == null) {
                throw new IllegalStateException(
                  "Cannot call clear() after build().");
              }
              result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch();
              return this;
            }
            
            public Builder clone() {
              return create().mergeFrom(result);
            }
            
            public com.google.gwt.dev.protobuf.Descriptors.Descriptor
                getDescriptorForType() {
              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch.getDescriptor();
            }
            
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch getDefaultInstanceForType() {
              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch.getDefaultInstance();
            }
            
            public boolean isInitialized() {
              return result.isInitialized();
            }
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch build() {
              if (result != null && !isInitialized()) {
                throw newUninitializedMessageException(result);
              }
              return buildPartial();
            }
            
            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch buildParsed()
                throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
              if (!isInitialized()) {
                throw newUninitializedMessageException(
                  result).asInvalidProtocolBufferException();
              }
              return buildPartial();
            }
            
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch buildPartial() {
              if (result == null) {
                throw new IllegalStateException(
                  "build() has already been called on this Builder.");
              }
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch returnMe = result;
              result = null;
              return returnMe;
            }
            
            public Builder mergeFrom(com.google.gwt.dev.protobuf.Message other) {
              if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch) {
                return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch)other);
              } else {
                super.mergeFrom(other);
                return this;
              }
            }
            
            public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch other) {
              if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch.getDefaultInstance()) return this;
              if (other.hasLogHandle()) {
                setLogHandle(other.getLogHandle());
              }
              this.mergeUnknownFields(other.getUnknownFields());
              return this;
            }
            
            public Builder mergeFrom(
                com.google.gwt.dev.protobuf.CodedInputStream input,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws java.io.IOException {
              com.google.gwt.dev.protobuf.UnknownFieldSet.Builder unknownFields =
                com.google.gwt.dev.protobuf.UnknownFieldSet.newBuilder(
                  this.getUnknownFields());
              while (true) {
                int tag = input.readTag();
                switch (tag) {
                  case 0:
                    this.setUnknownFields(unknownFields.build());
                    return this;
                  default: {
                    if (!parseUnknownField(input, unknownFields,
                                           extensionRegistry, tag)) {
                      this.setUnknownFields(unknownFields.build());
                      return this;
                    }
                    break;
                  }
                  case 8: {
                    setLogHandle(input.readUInt32());
                    break;
                  }
                }
              }
            }
            
            
            // required uint32 logHandle = 1;
            public boolean hasLogHandle() {
              return result.hasLogHandle();
            }
            public int getLogHandle() {
              return result.getLogHandle();
            }
            public Builder setLogHandle(int value) {
              result.hasLogHandle = true;
              result.logHandle_ = value;
              return this;
            }
            public Builder clearLogHandle() {
              result.hasLogHandle = false;
              result.logHandle_ = 0;
              return this;
            }
          }
          
          static {
            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
          }
          
          static {
            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
          }
        }
        
        // optional .com.google.gwt.dev.shell.remoteui.Message.Response.ViewerResponse.ResponseType responseType = 1;
        public static final int RESPONSETYPE_FIELD_NUMBER = 1;
        private boolean hasResponseType;
        private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.ResponseType responseType_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.ResponseType.CAPABILITY_EXCHANGE;
        public boolean hasResponseType() { return hasResponseType; }
        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.ResponseType getResponseType() { return responseType_; }
        
        // optional .com.google.gwt.dev.shell.remoteui.Message.Response.ViewerResponse.CapabilityExchange capabilityExchange = 2;
        public static final int CAPABILITYEXCHANGE_FIELD_NUMBER = 2;
        private boolean hasCapabilityExchange;
        private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange capabilityExchange_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.getDefaultInstance();
        public boolean hasCapabilityExchange() { return hasCapabilityExchange; }
        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange getCapabilityExchange() { return capabilityExchange_; }
        
        // optional .com.google.gwt.dev.shell.remoteui.Message.Response.ViewerResponse.AddLog addLog = 3;
        public static final int ADDLOG_FIELD_NUMBER = 3;
        private boolean hasAddLog;
        private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog addLog_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog.getDefaultInstance();
        public boolean hasAddLog() { return hasAddLog; }
        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog getAddLog() { return addLog_; }
        
        // optional .com.google.gwt.dev.shell.remoteui.Message.Response.ViewerResponse.AddLogBranch addLogBranch = 4;
        public static final int ADDLOGBRANCH_FIELD_NUMBER = 4;
        private boolean hasAddLogBranch;
        private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch addLogBranch_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch.getDefaultInstance();
        public boolean hasAddLogBranch() { return hasAddLogBranch; }
        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch getAddLogBranch() { return addLogBranch_; }
        
        public final boolean isInitialized() {
          if (hasAddLog()) {
            if (!getAddLog().isInitialized()) return false;
          }
          if (hasAddLogBranch()) {
            if (!getAddLogBranch().isInitialized()) return false;
          }
          return true;
        }
        
        public void writeTo(com.google.gwt.dev.protobuf.CodedOutputStream output)
                            throws java.io.IOException {
          if (hasResponseType()) {
            output.writeEnum(1, getResponseType().getNumber());
          }
          if (hasCapabilityExchange()) {
            output.writeMessage(2, getCapabilityExchange());
          }
          if (hasAddLog()) {
            output.writeMessage(3, getAddLog());
          }
          if (hasAddLogBranch()) {
            output.writeMessage(4, getAddLogBranch());
          }
          getUnknownFields().writeTo(output);
        }
        
        private int memoizedSerializedSize = -1;
        public int getSerializedSize() {
          int size = memoizedSerializedSize;
          if (size != -1) return size;
        
          size = 0;
          if (hasResponseType()) {
            size += com.google.gwt.dev.protobuf.CodedOutputStream
              .computeEnumSize(1, getResponseType().getNumber());
          }
          if (hasCapabilityExchange()) {
            size += com.google.gwt.dev.protobuf.CodedOutputStream
              .computeMessageSize(2, getCapabilityExchange());
          }
          if (hasAddLog()) {
            size += com.google.gwt.dev.protobuf.CodedOutputStream
              .computeMessageSize(3, getAddLog());
          }
          if (hasAddLogBranch()) {
            size += com.google.gwt.dev.protobuf.CodedOutputStream
              .computeMessageSize(4, getAddLogBranch());
          }
          size += getUnknownFields().getSerializedSize();
          memoizedSerializedSize = size;
          return size;
        }
        
        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse parseFrom(
            com.google.gwt.dev.protobuf.ByteString data)
            throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
          return newBuilder().mergeFrom(data).buildParsed();
        }
        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse parseFrom(
            com.google.gwt.dev.protobuf.ByteString data,
            com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
          return newBuilder().mergeFrom(data, extensionRegistry)
                   .buildParsed();
        }
        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse parseFrom(byte[] data)
            throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
          return newBuilder().mergeFrom(data).buildParsed();
        }
        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse parseFrom(
            byte[] data,
            com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
          return newBuilder().mergeFrom(data, extensionRegistry)
                   .buildParsed();
        }
        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse parseFrom(java.io.InputStream input)
            throws java.io.IOException {
          return newBuilder().mergeFrom(input).buildParsed();
        }
        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse parseFrom(
            java.io.InputStream input,
            com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          return newBuilder().mergeFrom(input, extensionRegistry)
                   .buildParsed();
        }
        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse parseDelimitedFrom(java.io.InputStream input)
            throws java.io.IOException {
          return newBuilder().mergeDelimitedFrom(input).buildParsed();
        }
        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse parseDelimitedFrom(
            java.io.InputStream input,
            com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
                   .buildParsed();
        }
        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse parseFrom(
            com.google.gwt.dev.protobuf.CodedInputStream input)
            throws java.io.IOException {
          return newBuilder().mergeFrom(input).buildParsed();
        }
        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse parseFrom(
            com.google.gwt.dev.protobuf.CodedInputStream input,
            com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          return newBuilder().mergeFrom(input, extensionRegistry)
                   .buildParsed();
        }
        
        public static Builder newBuilder() { return Builder.create(); }
        public Builder newBuilderForType() { return newBuilder(); }
        public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse prototype) {
          return newBuilder().mergeFrom(prototype);
        }
        public Builder toBuilder() { return newBuilder(this); }
        
        public static final class Builder extends
            com.google.gwt.dev.protobuf.GeneratedMessage.Builder<Builder> {
          private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse result;
          
          // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.newBuilder()
          private Builder() {}
          
          private static Builder create() {
            Builder builder = new Builder();
            builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse();
            return builder;
          }
          
          protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse internalGetResult() {
            return result;
          }
          
          public Builder clear() {
            if (result == null) {
              throw new IllegalStateException(
                "Cannot call clear() after build().");
            }
            result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse();
            return this;
          }
          
          public Builder clone() {
            return create().mergeFrom(result);
          }
          
          public com.google.gwt.dev.protobuf.Descriptors.Descriptor
              getDescriptorForType() {
            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.getDescriptor();
          }
          
          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse getDefaultInstanceForType() {
            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.getDefaultInstance();
          }
          
          public boolean isInitialized() {
            return result.isInitialized();
          }
          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse build() {
            if (result != null && !isInitialized()) {
              throw newUninitializedMessageException(result);
            }
            return buildPartial();
          }
          
          private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse buildParsed()
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            if (!isInitialized()) {
              throw newUninitializedMessageException(
                result).asInvalidProtocolBufferException();
            }
            return buildPartial();
          }
          
          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse buildPartial() {
            if (result == null) {
              throw new IllegalStateException(
                "build() has already been called on this Builder.");
            }
            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse returnMe = result;
            result = null;
            return returnMe;
          }
          
          public Builder mergeFrom(com.google.gwt.dev.protobuf.Message other) {
            if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse) {
              return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse)other);
            } else {
              super.mergeFrom(other);
              return this;
            }
          }
          
          public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse other) {
            if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.getDefaultInstance()) return this;
            if (other.hasResponseType()) {
              setResponseType(other.getResponseType());
            }
            if (other.hasCapabilityExchange()) {
              mergeCapabilityExchange(other.getCapabilityExchange());
            }
            if (other.hasAddLog()) {
              mergeAddLog(other.getAddLog());
            }
            if (other.hasAddLogBranch()) {
              mergeAddLogBranch(other.getAddLogBranch());
            }
            this.mergeUnknownFields(other.getUnknownFields());
            return this;
          }
          
          public Builder mergeFrom(
              com.google.gwt.dev.protobuf.CodedInputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            com.google.gwt.dev.protobuf.UnknownFieldSet.Builder unknownFields =
              com.google.gwt.dev.protobuf.UnknownFieldSet.newBuilder(
                this.getUnknownFields());
            while (true) {
              int tag = input.readTag();
              switch (tag) {
                case 0:
                  this.setUnknownFields(unknownFields.build());
                  return this;
                default: {
                  if (!parseUnknownField(input, unknownFields,
                                         extensionRegistry, tag)) {
                    this.setUnknownFields(unknownFields.build());
                    return this;
                  }
                  break;
                }
                case 8: {
                  int rawValue = input.readEnum();
                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.ResponseType value = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.ResponseType.valueOf(rawValue);
                  if (value == null) {
                    unknownFields.mergeVarintField(1, rawValue);
                  } else {
                    setResponseType(value);
                  }
                  break;
                }
                case 18: {
                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.newBuilder();
                  if (hasCapabilityExchange()) {
                    subBuilder.mergeFrom(getCapabilityExchange());
                  }
                  input.readMessage(subBuilder, extensionRegistry);
                  setCapabilityExchange(subBuilder.buildPartial());
                  break;
                }
                case 26: {
                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog.newBuilder();
                  if (hasAddLog()) {
                    subBuilder.mergeFrom(getAddLog());
                  }
                  input.readMessage(subBuilder, extensionRegistry);
                  setAddLog(subBuilder.buildPartial());
                  break;
                }
                case 34: {
                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch.newBuilder();
                  if (hasAddLogBranch()) {
                    subBuilder.mergeFrom(getAddLogBranch());
                  }
                  input.readMessage(subBuilder, extensionRegistry);
                  setAddLogBranch(subBuilder.buildPartial());
                  break;
                }
              }
            }
          }
          
          
          // optional .com.google.gwt.dev.shell.remoteui.Message.Response.ViewerResponse.ResponseType responseType = 1;
          public boolean hasResponseType() {
            return result.hasResponseType();
          }
          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.ResponseType getResponseType() {
            return result.getResponseType();
          }
          public Builder setResponseType(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.ResponseType value) {
            if (value == null) {
              throw new NullPointerException();
            }
            result.hasResponseType = true;
            result.responseType_ = value;
            return this;
          }
          public Builder clearResponseType() {
            result.hasResponseType = false;
            result.responseType_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.ResponseType.CAPABILITY_EXCHANGE;
            return this;
          }
          
          // optional .com.google.gwt.dev.shell.remoteui.Message.Response.ViewerResponse.CapabilityExchange capabilityExchange = 2;
          public boolean hasCapabilityExchange() {
            return result.hasCapabilityExchange();
          }
          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange getCapabilityExchange() {
            return result.getCapabilityExchange();
          }
          public Builder setCapabilityExchange(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange value) {
            if (value == null) {
              throw new NullPointerException();
            }
            result.hasCapabilityExchange = true;
            result.capabilityExchange_ = value;
            return this;
          }
          public Builder setCapabilityExchange(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Builder builderForValue) {
            result.hasCapabilityExchange = true;
            result.capabilityExchange_ = builderForValue.build();
            return this;
          }
          public Builder mergeCapabilityExchange(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange value) {
            if (result.hasCapabilityExchange() &&
                result.capabilityExchange_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.getDefaultInstance()) {
              result.capabilityExchange_ =
                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.newBuilder(result.capabilityExchange_).mergeFrom(value).buildPartial();
            } else {
              result.capabilityExchange_ = value;
            }
            result.hasCapabilityExchange = true;
            return this;
          }
          public Builder clearCapabilityExchange() {
            result.hasCapabilityExchange = false;
            result.capabilityExchange_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.getDefaultInstance();
            return this;
          }
          
          // optional .com.google.gwt.dev.shell.remoteui.Message.Response.ViewerResponse.AddLog addLog = 3;
          public boolean hasAddLog() {
            return result.hasAddLog();
          }
          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog getAddLog() {
            return result.getAddLog();
          }
          public Builder setAddLog(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog value) {
            if (value == null) {
              throw new NullPointerException();
            }
            result.hasAddLog = true;
            result.addLog_ = value;
            return this;
          }
          public Builder setAddLog(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog.Builder builderForValue) {
            result.hasAddLog = true;
            result.addLog_ = builderForValue.build();
            return this;
          }
          public Builder mergeAddLog(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog value) {
            if (result.hasAddLog() &&
                result.addLog_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog.getDefaultInstance()) {
              result.addLog_ =
                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog.newBuilder(result.addLog_).mergeFrom(value).buildPartial();
            } else {
              result.addLog_ = value;
            }
            result.hasAddLog = true;
            return this;
          }
          public Builder clearAddLog() {
            result.hasAddLog = false;
            result.addLog_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog.getDefaultInstance();
            return this;
          }
          
          // optional .com.google.gwt.dev.shell.remoteui.Message.Response.ViewerResponse.AddLogBranch addLogBranch = 4;
          public boolean hasAddLogBranch() {
            return result.hasAddLogBranch();
          }
          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch getAddLogBranch() {
            return result.getAddLogBranch();
          }
          public Builder setAddLogBranch(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch value) {
            if (value == null) {
              throw new NullPointerException();
            }
            result.hasAddLogBranch = true;
            result.addLogBranch_ = value;
            return this;
          }
          public Builder setAddLogBranch(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch.Builder builderForValue) {
            result.hasAddLogBranch = true;
            result.addLogBranch_ = builderForValue.build();
            return this;
          }
          public Builder mergeAddLogBranch(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch value) {
            if (result.hasAddLogBranch() &&
                result.addLogBranch_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch.getDefaultInstance()) {
              result.addLogBranch_ =
                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch.newBuilder(result.addLogBranch_).mergeFrom(value).buildPartial();
            } else {
              result.addLogBranch_ = value;
            }
            result.hasAddLogBranch = true;
            return this;
          }
          public Builder clearAddLogBranch() {
            result.hasAddLogBranch = false;
            result.addLogBranch_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch.getDefaultInstance();
            return this;
          }
        }
        
        static {
          com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
        }
        
        static {
          com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
        }
      }
      
      public static final class DevModeResponse extends
          com.google.gwt.dev.protobuf.GeneratedMessage {
        // Use DevModeResponse.newBuilder() to construct.
        private DevModeResponse() {}
        
        private static final DevModeResponse defaultInstance = new DevModeResponse();
        public static DevModeResponse getDefaultInstance() {
          return defaultInstance;
        }
        
        public DevModeResponse getDefaultInstanceForType() {
          return defaultInstance;
        }
        
        public static final com.google.gwt.dev.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_descriptor;
        }
        
        protected com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_fieldAccessorTable;
        }
        
        public enum ResponseType
            implements com.google.gwt.dev.protobuf.ProtocolMessageEnum {
          CAPABILITY_EXCHANGE(0, 0),
          RESTART_WEB_SERVER(1, 1),
          ;
          
          
          public final int getNumber() { return value; }
          
          public static ResponseType valueOf(int value) {
            switch (value) {
              case 0: return CAPABILITY_EXCHANGE;
              case 1: return RESTART_WEB_SERVER;
              default: return null;
            }
          }
          
          public static com.google.gwt.dev.protobuf.Internal.EnumLiteMap<ResponseType>
              internalGetValueMap() {
            return internalValueMap;
          }
          private static com.google.gwt.dev.protobuf.Internal.EnumLiteMap<ResponseType>
              internalValueMap =
                new com.google.gwt.dev.protobuf.Internal.EnumLiteMap<ResponseType>() {
                  public ResponseType findValueByNumber(int number) {
                    return ResponseType.valueOf(number)
          ;        }
                };
          
          public final com.google.gwt.dev.protobuf.Descriptors.EnumValueDescriptor
              getValueDescriptor() {
            return getDescriptor().getValues().get(index);
          }
          public final com.google.gwt.dev.protobuf.Descriptors.EnumDescriptor
              getDescriptorForType() {
            return getDescriptor();
          }
          public static final com.google.gwt.dev.protobuf.Descriptors.EnumDescriptor
              getDescriptor() {
            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.getDescriptor().getEnumTypes().get(0);
          }
          
          private static final ResponseType[] VALUES = {
            CAPABILITY_EXCHANGE, RESTART_WEB_SERVER, 
          };
          public static ResponseType valueOf(
              com.google.gwt.dev.protobuf.Descriptors.EnumValueDescriptor desc) {
            if (desc.getType() != getDescriptor()) {
              throw new java.lang.IllegalArgumentException(
                "EnumValueDescriptor is not for this type.");
            }
            return VALUES[desc.getIndex()];
          }
          private final int index;
          private final int value;
          private ResponseType(int index, int value) {
            this.index = index;
            this.value = value;
          }
          
          static {
            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
          }
        }
        
        public static final class CapabilityExchange extends
            com.google.gwt.dev.protobuf.GeneratedMessage {
          // Use CapabilityExchange.newBuilder() to construct.
          private CapabilityExchange() {}
          
          private static final CapabilityExchange defaultInstance = new CapabilityExchange();
          public static CapabilityExchange getDefaultInstance() {
            return defaultInstance;
          }
          
          public CapabilityExchange getDefaultInstanceForType() {
            return defaultInstance;
          }
          
          public static final com.google.gwt.dev.protobuf.Descriptors.Descriptor
              getDescriptor() {
            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_CapabilityExchange_descriptor;
          }
          
          protected com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
              internalGetFieldAccessorTable() {
            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_CapabilityExchange_fieldAccessorTable;
          }
          
          public static final class Capability extends
              com.google.gwt.dev.protobuf.GeneratedMessage {
            // Use Capability.newBuilder() to construct.
            private Capability() {}
            
            private static final Capability defaultInstance = new Capability();
            public static Capability getDefaultInstance() {
              return defaultInstance;
            }
            
            public Capability getDefaultInstanceForType() {
              return defaultInstance;
            }
            
            public static final com.google.gwt.dev.protobuf.Descriptors.Descriptor
                getDescriptor() {
              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_CapabilityExchange_Capability_descriptor;
            }
            
            protected com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
                internalGetFieldAccessorTable() {
              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_CapabilityExchange_Capability_fieldAccessorTable;
            }
            
            // optional .com.google.gwt.dev.shell.remoteui.Message.Request.DevModeRequest.RequestType capability = 1;
            public static final int CAPABILITY_FIELD_NUMBER = 1;
            private boolean hasCapability;
            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RequestType capability_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RequestType.CAPABILITY_EXCHANGE;
            public boolean hasCapability() { return hasCapability; }
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RequestType getCapability() { return capability_; }
            
            public final boolean isInitialized() {
              return true;
            }
            
            public void writeTo(com.google.gwt.dev.protobuf.CodedOutputStream output)
                                throws java.io.IOException {
              if (hasCapability()) {
                output.writeEnum(1, getCapability().getNumber());
              }
              getUnknownFields().writeTo(output);
            }
            
            private int memoizedSerializedSize = -1;
            public int getSerializedSize() {
              int size = memoizedSerializedSize;
              if (size != -1) return size;
            
              size = 0;
              if (hasCapability()) {
                size += com.google.gwt.dev.protobuf.CodedOutputStream
                  .computeEnumSize(1, getCapability().getNumber());
              }
              size += getUnknownFields().getSerializedSize();
              memoizedSerializedSize = size;
              return size;
            }
            
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability parseFrom(
                com.google.gwt.dev.protobuf.ByteString data)
                throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
              return newBuilder().mergeFrom(data).buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability parseFrom(
                com.google.gwt.dev.protobuf.ByteString data,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
              return newBuilder().mergeFrom(data, extensionRegistry)
                       .buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability parseFrom(byte[] data)
                throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
              return newBuilder().mergeFrom(data).buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability parseFrom(
                byte[] data,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
              return newBuilder().mergeFrom(data, extensionRegistry)
                       .buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability parseFrom(java.io.InputStream input)
                throws java.io.IOException {
              return newBuilder().mergeFrom(input).buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability parseFrom(
                java.io.InputStream input,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws java.io.IOException {
              return newBuilder().mergeFrom(input, extensionRegistry)
                       .buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability parseDelimitedFrom(java.io.InputStream input)
                throws java.io.IOException {
              return newBuilder().mergeDelimitedFrom(input).buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability parseDelimitedFrom(
                java.io.InputStream input,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws java.io.IOException {
              return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
                       .buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability parseFrom(
                com.google.gwt.dev.protobuf.CodedInputStream input)
                throws java.io.IOException {
              return newBuilder().mergeFrom(input).buildParsed();
            }
            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability parseFrom(
                com.google.gwt.dev.protobuf.CodedInputStream input,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws java.io.IOException {
              return newBuilder().mergeFrom(input, extensionRegistry)
                       .buildParsed();
            }
            
            public static Builder newBuilder() { return Builder.create(); }
            public Builder newBuilderForType() { return newBuilder(); }
            public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability prototype) {
              return newBuilder().mergeFrom(prototype);
            }
            public Builder toBuilder() { return newBuilder(this); }
            
            public static final class Builder extends
                com.google.gwt.dev.protobuf.GeneratedMessage.Builder<Builder> {
              private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability result;
              
              // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability.newBuilder()
              private Builder() {}
              
              private static Builder create() {
                Builder builder = new Builder();
                builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability();
                return builder;
              }
              
              protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability internalGetResult() {
                return result;
              }
              
              public Builder clear() {
                if (result == null) {
                  throw new IllegalStateException(
                    "Cannot call clear() after build().");
                }
                result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability();
                return this;
              }
              
              public Builder clone() {
                return create().mergeFrom(result);
              }
              
              public com.google.gwt.dev.protobuf.Descriptors.Descriptor
                  getDescriptorForType() {
                return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability.getDescriptor();
              }
              
              public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability getDefaultInstanceForType() {
                return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability.getDefaultInstance();
              }
              
              public boolean isInitialized() {
                return result.isInitialized();
              }
              public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability build() {
                if (result != null && !isInitialized()) {
                  throw newUninitializedMessageException(result);
                }
                return buildPartial();
              }
              
              private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability buildParsed()
                  throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
                if (!isInitialized()) {
                  throw newUninitializedMessageException(
                    result).asInvalidProtocolBufferException();
                }
                return buildPartial();
              }
              
              public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability buildPartial() {
                if (result == null) {
                  throw new IllegalStateException(
                    "build() has already been called on this Builder.");
                }
                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability returnMe = result;
                result = null;
                return returnMe;
              }
              
              public Builder mergeFrom(com.google.gwt.dev.protobuf.Message other) {
                if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability) {
                  return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability)other);
                } else {
                  super.mergeFrom(other);
                  return this;
                }
              }
              
              public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability other) {
                if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability.getDefaultInstance()) return this;
                if (other.hasCapability()) {
                  setCapability(other.getCapability());
                }
                this.mergeUnknownFields(other.getUnknownFields());
                return this;
              }
              
              public Builder mergeFrom(
                  com.google.gwt.dev.protobuf.CodedInputStream input,
                  com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                  throws java.io.IOException {
                com.google.gwt.dev.protobuf.UnknownFieldSet.Builder unknownFields =
                  com.google.gwt.dev.protobuf.UnknownFieldSet.newBuilder(
                    this.getUnknownFields());
                while (true) {
                  int tag = input.readTag();
                  switch (tag) {
                    case 0:
                      this.setUnknownFields(unknownFields.build());
                      return this;
                    default: {
                      if (!parseUnknownField(input, unknownFields,
                                             extensionRegistry, tag)) {
                        this.setUnknownFields(unknownFields.build());
                        return this;
                      }
                      break;
                    }
                    case 8: {
                      int rawValue = input.readEnum();
                      com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RequestType value = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RequestType.valueOf(rawValue);
                      if (value == null) {
                        unknownFields.mergeVarintField(1, rawValue);
                      } else {
                        setCapability(value);
                      }
                      break;
                    }
                  }
                }
              }
              
              
              // optional .com.google.gwt.dev.shell.remoteui.Message.Request.DevModeRequest.RequestType capability = 1;
              public boolean hasCapability() {
                return result.hasCapability();
              }
              public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RequestType getCapability() {
                return result.getCapability();
              }
              public Builder setCapability(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RequestType value) {
                if (value == null) {
                  throw new NullPointerException();
                }
                result.hasCapability = true;
                result.capability_ = value;
                return this;
              }
              public Builder clearCapability() {
                result.hasCapability = false;
                result.capability_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RequestType.CAPABILITY_EXCHANGE;
                return this;
              }
            }
            
            static {
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
            }
            
            static {
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
            }
          }
          
          // repeated .com.google.gwt.dev.shell.remoteui.Message.Response.DevModeResponse.CapabilityExchange.Capability capabilities = 2;
          public static final int CAPABILITIES_FIELD_NUMBER = 2;
          private java.util.List<com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability> capabilities_ =
            java.util.Collections.emptyList();
          public java.util.List<com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability> getCapabilitiesList() {
            return capabilities_;
          }
          public int getCapabilitiesCount() { return capabilities_.size(); }
          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability getCapabilities(int index) {
            return capabilities_.get(index);
          }
          
          public final boolean isInitialized() {
            return true;
          }
          
          public void writeTo(com.google.gwt.dev.protobuf.CodedOutputStream output)
                              throws java.io.IOException {
            for (com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability element : getCapabilitiesList()) {
              output.writeMessage(2, element);
            }
            getUnknownFields().writeTo(output);
          }
          
          private int memoizedSerializedSize = -1;
          public int getSerializedSize() {
            int size = memoizedSerializedSize;
            if (size != -1) return size;
          
            size = 0;
            for (com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability element : getCapabilitiesList()) {
              size += com.google.gwt.dev.protobuf.CodedOutputStream
                .computeMessageSize(2, element);
            }
            size += getUnknownFields().getSerializedSize();
            memoizedSerializedSize = size;
            return size;
          }
          
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange parseFrom(
              com.google.gwt.dev.protobuf.ByteString data)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange parseFrom(
              com.google.gwt.dev.protobuf.ByteString data,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange parseFrom(byte[] data)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange parseFrom(
              byte[] data,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange parseFrom(java.io.InputStream input)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange parseFrom(
              java.io.InputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange parseDelimitedFrom(java.io.InputStream input)
              throws java.io.IOException {
            return newBuilder().mergeDelimitedFrom(input).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange parseDelimitedFrom(
              java.io.InputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange parseFrom(
              com.google.gwt.dev.protobuf.CodedInputStream input)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange parseFrom(
              com.google.gwt.dev.protobuf.CodedInputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input, extensionRegistry)
                     .buildParsed();
          }
          
          public static Builder newBuilder() { return Builder.create(); }
          public Builder newBuilderForType() { return newBuilder(); }
          public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange prototype) {
            return newBuilder().mergeFrom(prototype);
          }
          public Builder toBuilder() { return newBuilder(this); }
          
          public static final class Builder extends
              com.google.gwt.dev.protobuf.GeneratedMessage.Builder<Builder> {
            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange result;
            
            // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.newBuilder()
            private Builder() {}
            
            private static Builder create() {
              Builder builder = new Builder();
              builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange();
              return builder;
            }
            
            protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange internalGetResult() {
              return result;
            }
            
            public Builder clear() {
              if (result == null) {
                throw new IllegalStateException(
                  "Cannot call clear() after build().");
              }
              result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange();
              return this;
            }
            
            public Builder clone() {
              return create().mergeFrom(result);
            }
            
            public com.google.gwt.dev.protobuf.Descriptors.Descriptor
                getDescriptorForType() {
              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.getDescriptor();
            }
            
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange getDefaultInstanceForType() {
              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.getDefaultInstance();
            }
            
            public boolean isInitialized() {
              return result.isInitialized();
            }
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange build() {
              if (result != null && !isInitialized()) {
                throw newUninitializedMessageException(result);
              }
              return buildPartial();
            }
            
            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange buildParsed()
                throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
              if (!isInitialized()) {
                throw newUninitializedMessageException(
                  result).asInvalidProtocolBufferException();
              }
              return buildPartial();
            }
            
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange buildPartial() {
              if (result == null) {
                throw new IllegalStateException(
                  "build() has already been called on this Builder.");
              }
              if (result.capabilities_ != java.util.Collections.EMPTY_LIST) {
                result.capabilities_ =
                  java.util.Collections.unmodifiableList(result.capabilities_);
              }
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange returnMe = result;
              result = null;
              return returnMe;
            }
            
            public Builder mergeFrom(com.google.gwt.dev.protobuf.Message other) {
              if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange) {
                return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange)other);
              } else {
                super.mergeFrom(other);
                return this;
              }
            }
            
            public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange other) {
              if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.getDefaultInstance()) return this;
              if (!other.capabilities_.isEmpty()) {
                if (result.capabilities_.isEmpty()) {
                  result.capabilities_ = new java.util.ArrayList<com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability>();
                }
                result.capabilities_.addAll(other.capabilities_);
              }
              this.mergeUnknownFields(other.getUnknownFields());
              return this;
            }
            
            public Builder mergeFrom(
                com.google.gwt.dev.protobuf.CodedInputStream input,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws java.io.IOException {
              com.google.gwt.dev.protobuf.UnknownFieldSet.Builder unknownFields =
                com.google.gwt.dev.protobuf.UnknownFieldSet.newBuilder(
                  this.getUnknownFields());
              while (true) {
                int tag = input.readTag();
                switch (tag) {
                  case 0:
                    this.setUnknownFields(unknownFields.build());
                    return this;
                  default: {
                    if (!parseUnknownField(input, unknownFields,
                                           extensionRegistry, tag)) {
                      this.setUnknownFields(unknownFields.build());
                      return this;
                    }
                    break;
                  }
                  case 18: {
                    com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability.newBuilder();
                    input.readMessage(subBuilder, extensionRegistry);
                    addCapabilities(subBuilder.buildPartial());
                    break;
                  }
                }
              }
            }
            
            
            // repeated .com.google.gwt.dev.shell.remoteui.Message.Response.DevModeResponse.CapabilityExchange.Capability capabilities = 2;
            public java.util.List<com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability> getCapabilitiesList() {
              return java.util.Collections.unmodifiableList(result.capabilities_);
            }
            public int getCapabilitiesCount() {
              return result.getCapabilitiesCount();
            }
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability getCapabilities(int index) {
              return result.getCapabilities(index);
            }
            public Builder setCapabilities(int index, com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability value) {
              if (value == null) {
                throw new NullPointerException();
              }
              result.capabilities_.set(index, value);
              return this;
            }
            public Builder setCapabilities(int index, com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability.Builder builderForValue) {
              result.capabilities_.set(index, builderForValue.build());
              return this;
            }
            public Builder addCapabilities(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability value) {
              if (value == null) {
                throw new NullPointerException();
              }
              if (result.capabilities_.isEmpty()) {
                result.capabilities_ = new java.util.ArrayList<com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability>();
              }
              result.capabilities_.add(value);
              return this;
            }
            public Builder addCapabilities(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability.Builder builderForValue) {
              if (result.capabilities_.isEmpty()) {
                result.capabilities_ = new java.util.ArrayList<com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability>();
              }
              result.capabilities_.add(builderForValue.build());
              return this;
            }
            public Builder addAllCapabilities(
                java.lang.Iterable<? extends com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability> values) {
              if (result.capabilities_.isEmpty()) {
                result.capabilities_ = new java.util.ArrayList<com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability>();
              }
              super.addAll(values, result.capabilities_);
              return this;
            }
            public Builder clearCapabilities() {
              result.capabilities_ = java.util.Collections.emptyList();
              return this;
            }
          }
          
          static {
            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
          }
          
          static {
            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
          }
        }
        
        public static final class RestartWebServer extends
            com.google.gwt.dev.protobuf.GeneratedMessage {
          // Use RestartWebServer.newBuilder() to construct.
          private RestartWebServer() {}
          
          private static final RestartWebServer defaultInstance = new RestartWebServer();
          public static RestartWebServer getDefaultInstance() {
            return defaultInstance;
          }
          
          public RestartWebServer getDefaultInstanceForType() {
            return defaultInstance;
          }
          
          public static final com.google.gwt.dev.protobuf.Descriptors.Descriptor
              getDescriptor() {
            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_RestartWebServer_descriptor;
          }
          
          protected com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
              internalGetFieldAccessorTable() {
            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_RestartWebServer_fieldAccessorTable;
          }
          
          public final boolean isInitialized() {
            return true;
          }
          
          public void writeTo(com.google.gwt.dev.protobuf.CodedOutputStream output)
                              throws java.io.IOException {
            getUnknownFields().writeTo(output);
          }
          
          private int memoizedSerializedSize = -1;
          public int getSerializedSize() {
            int size = memoizedSerializedSize;
            if (size != -1) return size;
          
            size = 0;
            size += getUnknownFields().getSerializedSize();
            memoizedSerializedSize = size;
            return size;
          }
          
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer parseFrom(
              com.google.gwt.dev.protobuf.ByteString data)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer parseFrom(
              com.google.gwt.dev.protobuf.ByteString data,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer parseFrom(byte[] data)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer parseFrom(
              byte[] data,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            return newBuilder().mergeFrom(data, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer parseFrom(java.io.InputStream input)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer parseFrom(
              java.io.InputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer parseDelimitedFrom(java.io.InputStream input)
              throws java.io.IOException {
            return newBuilder().mergeDelimitedFrom(input).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer parseDelimitedFrom(
              java.io.InputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
                     .buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer parseFrom(
              com.google.gwt.dev.protobuf.CodedInputStream input)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input).buildParsed();
          }
          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer parseFrom(
              com.google.gwt.dev.protobuf.CodedInputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            return newBuilder().mergeFrom(input, extensionRegistry)
                     .buildParsed();
          }
          
          public static Builder newBuilder() { return Builder.create(); }
          public Builder newBuilderForType() { return newBuilder(); }
          public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer prototype) {
            return newBuilder().mergeFrom(prototype);
          }
          public Builder toBuilder() { return newBuilder(this); }
          
          public static final class Builder extends
              com.google.gwt.dev.protobuf.GeneratedMessage.Builder<Builder> {
            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer result;
            
            // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer.newBuilder()
            private Builder() {}
            
            private static Builder create() {
              Builder builder = new Builder();
              builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer();
              return builder;
            }
            
            protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer internalGetResult() {
              return result;
            }
            
            public Builder clear() {
              if (result == null) {
                throw new IllegalStateException(
                  "Cannot call clear() after build().");
              }
              result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer();
              return this;
            }
            
            public Builder clone() {
              return create().mergeFrom(result);
            }
            
            public com.google.gwt.dev.protobuf.Descriptors.Descriptor
                getDescriptorForType() {
              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer.getDescriptor();
            }
            
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer getDefaultInstanceForType() {
              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer.getDefaultInstance();
            }
            
            public boolean isInitialized() {
              return result.isInitialized();
            }
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer build() {
              if (result != null && !isInitialized()) {
                throw newUninitializedMessageException(result);
              }
              return buildPartial();
            }
            
            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer buildParsed()
                throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
              if (!isInitialized()) {
                throw newUninitializedMessageException(
                  result).asInvalidProtocolBufferException();
              }
              return buildPartial();
            }
            
            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer buildPartial() {
              if (result == null) {
                throw new IllegalStateException(
                  "build() has already been called on this Builder.");
              }
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer returnMe = result;
              result = null;
              return returnMe;
            }
            
            public Builder mergeFrom(com.google.gwt.dev.protobuf.Message other) {
              if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer) {
                return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer)other);
              } else {
                super.mergeFrom(other);
                return this;
              }
            }
            
            public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer other) {
              if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer.getDefaultInstance()) return this;
              this.mergeUnknownFields(other.getUnknownFields());
              return this;
            }
            
            public Builder mergeFrom(
                com.google.gwt.dev.protobuf.CodedInputStream input,
                com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
                throws java.io.IOException {
              com.google.gwt.dev.protobuf.UnknownFieldSet.Builder unknownFields =
                com.google.gwt.dev.protobuf.UnknownFieldSet.newBuilder(
                  this.getUnknownFields());
              while (true) {
                int tag = input.readTag();
                switch (tag) {
                  case 0:
                    this.setUnknownFields(unknownFields.build());
                    return this;
                  default: {
                    if (!parseUnknownField(input, unknownFields,
                                           extensionRegistry, tag)) {
                      this.setUnknownFields(unknownFields.build());
                      return this;
                    }
                    break;
                  }
                }
              }
            }
            
          }
          
          static {
            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
          }
          
          static {
            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
          }
        }
        
        // optional .com.google.gwt.dev.shell.remoteui.Message.Response.DevModeResponse.ResponseType responseType = 1;
        public static final int RESPONSETYPE_FIELD_NUMBER = 1;
        private boolean hasResponseType;
        private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.ResponseType responseType_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.ResponseType.CAPABILITY_EXCHANGE;
        public boolean hasResponseType() { return hasResponseType; }
        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.ResponseType getResponseType() { return responseType_; }
        
        // optional .com.google.gwt.dev.shell.remoteui.Message.Response.DevModeResponse.CapabilityExchange capabilityExchange = 2;
        public static final int CAPABILITYEXCHANGE_FIELD_NUMBER = 2;
        private boolean hasCapabilityExchange;
        private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange capabilityExchange_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.getDefaultInstance();
        public boolean hasCapabilityExchange() { return hasCapabilityExchange; }
        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange getCapabilityExchange() { return capabilityExchange_; }
        
        // optional .com.google.gwt.dev.shell.remoteui.Message.Response.DevModeResponse.RestartWebServer restartWebServer = 3;
        public static final int RESTARTWEBSERVER_FIELD_NUMBER = 3;
        private boolean hasRestartWebServer;
        private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer restartWebServer_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer.getDefaultInstance();
        public boolean hasRestartWebServer() { return hasRestartWebServer; }
        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer getRestartWebServer() { return restartWebServer_; }
        
        public final boolean isInitialized() {
          return true;
        }
        
        public void writeTo(com.google.gwt.dev.protobuf.CodedOutputStream output)
                            throws java.io.IOException {
          if (hasResponseType()) {
            output.writeEnum(1, getResponseType().getNumber());
          }
          if (hasCapabilityExchange()) {
            output.writeMessage(2, getCapabilityExchange());
          }
          if (hasRestartWebServer()) {
            output.writeMessage(3, getRestartWebServer());
          }
          getUnknownFields().writeTo(output);
        }
        
        private int memoizedSerializedSize = -1;
        public int getSerializedSize() {
          int size = memoizedSerializedSize;
          if (size != -1) return size;
        
          size = 0;
          if (hasResponseType()) {
            size += com.google.gwt.dev.protobuf.CodedOutputStream
              .computeEnumSize(1, getResponseType().getNumber());
          }
          if (hasCapabilityExchange()) {
            size += com.google.gwt.dev.protobuf.CodedOutputStream
              .computeMessageSize(2, getCapabilityExchange());
          }
          if (hasRestartWebServer()) {
            size += com.google.gwt.dev.protobuf.CodedOutputStream
              .computeMessageSize(3, getRestartWebServer());
          }
          size += getUnknownFields().getSerializedSize();
          memoizedSerializedSize = size;
          return size;
        }
        
        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse parseFrom(
            com.google.gwt.dev.protobuf.ByteString data)
            throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
          return newBuilder().mergeFrom(data).buildParsed();
        }
        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse parseFrom(
            com.google.gwt.dev.protobuf.ByteString data,
            com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
          return newBuilder().mergeFrom(data, extensionRegistry)
                   .buildParsed();
        }
        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse parseFrom(byte[] data)
            throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
          return newBuilder().mergeFrom(data).buildParsed();
        }
        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse parseFrom(
            byte[] data,
            com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
          return newBuilder().mergeFrom(data, extensionRegistry)
                   .buildParsed();
        }
        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse parseFrom(java.io.InputStream input)
            throws java.io.IOException {
          return newBuilder().mergeFrom(input).buildParsed();
        }
        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse parseFrom(
            java.io.InputStream input,
            com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          return newBuilder().mergeFrom(input, extensionRegistry)
                   .buildParsed();
        }
        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse parseDelimitedFrom(java.io.InputStream input)
            throws java.io.IOException {
          return newBuilder().mergeDelimitedFrom(input).buildParsed();
        }
        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse parseDelimitedFrom(
            java.io.InputStream input,
            com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
                   .buildParsed();
        }
        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse parseFrom(
            com.google.gwt.dev.protobuf.CodedInputStream input)
            throws java.io.IOException {
          return newBuilder().mergeFrom(input).buildParsed();
        }
        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse parseFrom(
            com.google.gwt.dev.protobuf.CodedInputStream input,
            com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          return newBuilder().mergeFrom(input, extensionRegistry)
                   .buildParsed();
        }
        
        public static Builder newBuilder() { return Builder.create(); }
        public Builder newBuilderForType() { return newBuilder(); }
        public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse prototype) {
          return newBuilder().mergeFrom(prototype);
        }
        public Builder toBuilder() { return newBuilder(this); }
        
        public static final class Builder extends
            com.google.gwt.dev.protobuf.GeneratedMessage.Builder<Builder> {
          private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse result;
          
          // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.newBuilder()
          private Builder() {}
          
          private static Builder create() {
            Builder builder = new Builder();
            builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse();
            return builder;
          }
          
          protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse internalGetResult() {
            return result;
          }
          
          public Builder clear() {
            if (result == null) {
              throw new IllegalStateException(
                "Cannot call clear() after build().");
            }
            result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse();
            return this;
          }
          
          public Builder clone() {
            return create().mergeFrom(result);
          }
          
          public com.google.gwt.dev.protobuf.Descriptors.Descriptor
              getDescriptorForType() {
            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.getDescriptor();
          }
          
          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse getDefaultInstanceForType() {
            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.getDefaultInstance();
          }
          
          public boolean isInitialized() {
            return result.isInitialized();
          }
          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse build() {
            if (result != null && !isInitialized()) {
              throw newUninitializedMessageException(result);
            }
            return buildPartial();
          }
          
          private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse buildParsed()
              throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
            if (!isInitialized()) {
              throw newUninitializedMessageException(
                result).asInvalidProtocolBufferException();
            }
            return buildPartial();
          }
          
          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse buildPartial() {
            if (result == null) {
              throw new IllegalStateException(
                "build() has already been called on this Builder.");
            }
            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse returnMe = result;
            result = null;
            return returnMe;
          }
          
          public Builder mergeFrom(com.google.gwt.dev.protobuf.Message other) {
            if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse) {
              return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse)other);
            } else {
              super.mergeFrom(other);
              return this;
            }
          }
          
          public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse other) {
            if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.getDefaultInstance()) return this;
            if (other.hasResponseType()) {
              setResponseType(other.getResponseType());
            }
            if (other.hasCapabilityExchange()) {
              mergeCapabilityExchange(other.getCapabilityExchange());
            }
            if (other.hasRestartWebServer()) {
              mergeRestartWebServer(other.getRestartWebServer());
            }
            this.mergeUnknownFields(other.getUnknownFields());
            return this;
          }
          
          public Builder mergeFrom(
              com.google.gwt.dev.protobuf.CodedInputStream input,
              com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            com.google.gwt.dev.protobuf.UnknownFieldSet.Builder unknownFields =
              com.google.gwt.dev.protobuf.UnknownFieldSet.newBuilder(
                this.getUnknownFields());
            while (true) {
              int tag = input.readTag();
              switch (tag) {
                case 0:
                  this.setUnknownFields(unknownFields.build());
                  return this;
                default: {
                  if (!parseUnknownField(input, unknownFields,
                                         extensionRegistry, tag)) {
                    this.setUnknownFields(unknownFields.build());
                    return this;
                  }
                  break;
                }
                case 8: {
                  int rawValue = input.readEnum();
                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.ResponseType value = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.ResponseType.valueOf(rawValue);
                  if (value == null) {
                    unknownFields.mergeVarintField(1, rawValue);
                  } else {
                    setResponseType(value);
                  }
                  break;
                }
                case 18: {
                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.newBuilder();
                  if (hasCapabilityExchange()) {
                    subBuilder.mergeFrom(getCapabilityExchange());
                  }
                  input.readMessage(subBuilder, extensionRegistry);
                  setCapabilityExchange(subBuilder.buildPartial());
                  break;
                }
                case 26: {
                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer.newBuilder();
                  if (hasRestartWebServer()) {
                    subBuilder.mergeFrom(getRestartWebServer());
                  }
                  input.readMessage(subBuilder, extensionRegistry);
                  setRestartWebServer(subBuilder.buildPartial());
                  break;
                }
              }
            }
          }
          
          
          // optional .com.google.gwt.dev.shell.remoteui.Message.Response.DevModeResponse.ResponseType responseType = 1;
          public boolean hasResponseType() {
            return result.hasResponseType();
          }
          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.ResponseType getResponseType() {
            return result.getResponseType();
          }
          public Builder setResponseType(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.ResponseType value) {
            if (value == null) {
              throw new NullPointerException();
            }
            result.hasResponseType = true;
            result.responseType_ = value;
            return this;
          }
          public Builder clearResponseType() {
            result.hasResponseType = false;
            result.responseType_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.ResponseType.CAPABILITY_EXCHANGE;
            return this;
          }
          
          // optional .com.google.gwt.dev.shell.remoteui.Message.Response.DevModeResponse.CapabilityExchange capabilityExchange = 2;
          public boolean hasCapabilityExchange() {
            return result.hasCapabilityExchange();
          }
          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange getCapabilityExchange() {
            return result.getCapabilityExchange();
          }
          public Builder setCapabilityExchange(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange value) {
            if (value == null) {
              throw new NullPointerException();
            }
            result.hasCapabilityExchange = true;
            result.capabilityExchange_ = value;
            return this;
          }
          public Builder setCapabilityExchange(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Builder builderForValue) {
            result.hasCapabilityExchange = true;
            result.capabilityExchange_ = builderForValue.build();
            return this;
          }
          public Builder mergeCapabilityExchange(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange value) {
            if (result.hasCapabilityExchange() &&
                result.capabilityExchange_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.getDefaultInstance()) {
              result.capabilityExchange_ =
                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.newBuilder(result.capabilityExchange_).mergeFrom(value).buildPartial();
            } else {
              result.capabilityExchange_ = value;
            }
            result.hasCapabilityExchange = true;
            return this;
          }
          public Builder clearCapabilityExchange() {
            result.hasCapabilityExchange = false;
            result.capabilityExchange_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.getDefaultInstance();
            return this;
          }
          
          // optional .com.google.gwt.dev.shell.remoteui.Message.Response.DevModeResponse.RestartWebServer restartWebServer = 3;
          public boolean hasRestartWebServer() {
            return result.hasRestartWebServer();
          }
          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer getRestartWebServer() {
            return result.getRestartWebServer();
          }
          public Builder setRestartWebServer(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer value) {
            if (value == null) {
              throw new NullPointerException();
            }
            result.hasRestartWebServer = true;
            result.restartWebServer_ = value;
            return this;
          }
          public Builder setRestartWebServer(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer.Builder builderForValue) {
            result.hasRestartWebServer = true;
            result.restartWebServer_ = builderForValue.build();
            return this;
          }
          public Builder mergeRestartWebServer(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer value) {
            if (result.hasRestartWebServer() &&
                result.restartWebServer_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer.getDefaultInstance()) {
              result.restartWebServer_ =
                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer.newBuilder(result.restartWebServer_).mergeFrom(value).buildPartial();
            } else {
              result.restartWebServer_ = value;
            }
            result.hasRestartWebServer = true;
            return this;
          }
          public Builder clearRestartWebServer() {
            result.hasRestartWebServer = false;
            result.restartWebServer_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer.getDefaultInstance();
            return this;
          }
        }
        
        static {
          com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
        }
        
        static {
          com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
        }
      }
      
      // optional .com.google.gwt.dev.shell.remoteui.Message.Response.ViewerResponse viewerResponse = 1;
      public static final int VIEWERRESPONSE_FIELD_NUMBER = 1;
      private boolean hasViewerResponse;
      private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse viewerResponse_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.getDefaultInstance();
      public boolean hasViewerResponse() { return hasViewerResponse; }
      public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse getViewerResponse() { return viewerResponse_; }
      
      // optional .com.google.gwt.dev.shell.remoteui.Message.Response.DevModeResponse devModeResponse = 2;
      public static final int DEVMODERESPONSE_FIELD_NUMBER = 2;
      private boolean hasDevModeResponse;
      private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse devModeResponse_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.getDefaultInstance();
      public boolean hasDevModeResponse() { return hasDevModeResponse; }
      public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse getDevModeResponse() { return devModeResponse_; }
      
      public final boolean isInitialized() {
        if (hasViewerResponse()) {
          if (!getViewerResponse().isInitialized()) return false;
        }
        return true;
      }
      
      public void writeTo(com.google.gwt.dev.protobuf.CodedOutputStream output)
                          throws java.io.IOException {
        if (hasViewerResponse()) {
          output.writeMessage(1, getViewerResponse());
        }
        if (hasDevModeResponse()) {
          output.writeMessage(2, getDevModeResponse());
        }
        getUnknownFields().writeTo(output);
      }
      
      private int memoizedSerializedSize = -1;
      public int getSerializedSize() {
        int size = memoizedSerializedSize;
        if (size != -1) return size;
      
        size = 0;
        if (hasViewerResponse()) {
          size += com.google.gwt.dev.protobuf.CodedOutputStream
            .computeMessageSize(1, getViewerResponse());
        }
        if (hasDevModeResponse()) {
          size += com.google.gwt.dev.protobuf.CodedOutputStream
            .computeMessageSize(2, getDevModeResponse());
        }
        size += getUnknownFields().getSerializedSize();
        memoizedSerializedSize = size;
        return size;
      }
      
      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response parseFrom(
          com.google.gwt.dev.protobuf.ByteString data)
          throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
        return newBuilder().mergeFrom(data).buildParsed();
      }
      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response parseFrom(
          com.google.gwt.dev.protobuf.ByteString data,
          com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
        return newBuilder().mergeFrom(data, extensionRegistry)
                 .buildParsed();
      }
      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response parseFrom(byte[] data)
          throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
        return newBuilder().mergeFrom(data).buildParsed();
      }
      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response parseFrom(
          byte[] data,
          com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
        return newBuilder().mergeFrom(data, extensionRegistry)
                 .buildParsed();
      }
      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response parseFrom(java.io.InputStream input)
          throws java.io.IOException {
        return newBuilder().mergeFrom(input).buildParsed();
      }
      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response parseFrom(
          java.io.InputStream input,
          com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        return newBuilder().mergeFrom(input, extensionRegistry)
                 .buildParsed();
      }
      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response parseDelimitedFrom(java.io.InputStream input)
          throws java.io.IOException {
        return newBuilder().mergeDelimitedFrom(input).buildParsed();
      }
      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response parseDelimitedFrom(
          java.io.InputStream input,
          com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
                 .buildParsed();
      }
      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response parseFrom(
          com.google.gwt.dev.protobuf.CodedInputStream input)
          throws java.io.IOException {
        return newBuilder().mergeFrom(input).buildParsed();
      }
      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response parseFrom(
          com.google.gwt.dev.protobuf.CodedInputStream input,
          com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        return newBuilder().mergeFrom(input, extensionRegistry)
                 .buildParsed();
      }
      
      public static Builder newBuilder() { return Builder.create(); }
      public Builder newBuilderForType() { return newBuilder(); }
      public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response prototype) {
        return newBuilder().mergeFrom(prototype);
      }
      public Builder toBuilder() { return newBuilder(this); }
      
      public static final class Builder extends
          com.google.gwt.dev.protobuf.GeneratedMessage.Builder<Builder> {
        private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response result;
        
        // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.newBuilder()
        private Builder() {}
        
        private static Builder create() {
          Builder builder = new Builder();
          builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response();
          return builder;
        }
        
        protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response internalGetResult() {
          return result;
        }
        
        public Builder clear() {
          if (result == null) {
            throw new IllegalStateException(
              "Cannot call clear() after build().");
          }
          result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response();
          return this;
        }
        
        public Builder clone() {
          return create().mergeFrom(result);
        }
        
        public com.google.gwt.dev.protobuf.Descriptors.Descriptor
            getDescriptorForType() {
          return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.getDescriptor();
        }
        
        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response getDefaultInstanceForType() {
          return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.getDefaultInstance();
        }
        
        public boolean isInitialized() {
          return result.isInitialized();
        }
        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response build() {
          if (result != null && !isInitialized()) {
            throw newUninitializedMessageException(result);
          }
          return buildPartial();
        }
        
        private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response buildParsed()
            throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
          if (!isInitialized()) {
            throw newUninitializedMessageException(
              result).asInvalidProtocolBufferException();
          }
          return buildPartial();
        }
        
        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response buildPartial() {
          if (result == null) {
            throw new IllegalStateException(
              "build() has already been called on this Builder.");
          }
          com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response returnMe = result;
          result = null;
          return returnMe;
        }
        
        public Builder mergeFrom(com.google.gwt.dev.protobuf.Message other) {
          if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response) {
            return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response)other);
          } else {
            super.mergeFrom(other);
            return this;
          }
        }
        
        public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response other) {
          if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.getDefaultInstance()) return this;
          if (other.hasViewerResponse()) {
            mergeViewerResponse(other.getViewerResponse());
          }
          if (other.hasDevModeResponse()) {
            mergeDevModeResponse(other.getDevModeResponse());
          }
          this.mergeUnknownFields(other.getUnknownFields());
          return this;
        }
        
        public Builder mergeFrom(
            com.google.gwt.dev.protobuf.CodedInputStream input,
            com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          com.google.gwt.dev.protobuf.UnknownFieldSet.Builder unknownFields =
            com.google.gwt.dev.protobuf.UnknownFieldSet.newBuilder(
              this.getUnknownFields());
          while (true) {
            int tag = input.readTag();
            switch (tag) {
              case 0:
                this.setUnknownFields(unknownFields.build());
                return this;
              default: {
                if (!parseUnknownField(input, unknownFields,
                                       extensionRegistry, tag)) {
                  this.setUnknownFields(unknownFields.build());
                  return this;
                }
                break;
              }
              case 10: {
                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.newBuilder();
                if (hasViewerResponse()) {
                  subBuilder.mergeFrom(getViewerResponse());
                }
                input.readMessage(subBuilder, extensionRegistry);
                setViewerResponse(subBuilder.buildPartial());
                break;
              }
              case 18: {
                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.newBuilder();
                if (hasDevModeResponse()) {
                  subBuilder.mergeFrom(getDevModeResponse());
                }
                input.readMessage(subBuilder, extensionRegistry);
                setDevModeResponse(subBuilder.buildPartial());
                break;
              }
            }
          }
        }
        
        
        // optional .com.google.gwt.dev.shell.remoteui.Message.Response.ViewerResponse viewerResponse = 1;
        public boolean hasViewerResponse() {
          return result.hasViewerResponse();
        }
        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse getViewerResponse() {
          return result.getViewerResponse();
        }
        public Builder setViewerResponse(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse value) {
          if (value == null) {
            throw new NullPointerException();
          }
          result.hasViewerResponse = true;
          result.viewerResponse_ = value;
          return this;
        }
        public Builder setViewerResponse(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.Builder builderForValue) {
          result.hasViewerResponse = true;
          result.viewerResponse_ = builderForValue.build();
          return this;
        }
        public Builder mergeViewerResponse(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse value) {
          if (result.hasViewerResponse() &&
              result.viewerResponse_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.getDefaultInstance()) {
            result.viewerResponse_ =
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.newBuilder(result.viewerResponse_).mergeFrom(value).buildPartial();
          } else {
            result.viewerResponse_ = value;
          }
          result.hasViewerResponse = true;
          return this;
        }
        public Builder clearViewerResponse() {
          result.hasViewerResponse = false;
          result.viewerResponse_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.getDefaultInstance();
          return this;
        }
        
        // optional .com.google.gwt.dev.shell.remoteui.Message.Response.DevModeResponse devModeResponse = 2;
        public boolean hasDevModeResponse() {
          return result.hasDevModeResponse();
        }
        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse getDevModeResponse() {
          return result.getDevModeResponse();
        }
        public Builder setDevModeResponse(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse value) {
          if (value == null) {
            throw new NullPointerException();
          }
          result.hasDevModeResponse = true;
          result.devModeResponse_ = value;
          return this;
        }
        public Builder setDevModeResponse(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.Builder builderForValue) {
          result.hasDevModeResponse = true;
          result.devModeResponse_ = builderForValue.build();
          return this;
        }
        public Builder mergeDevModeResponse(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse value) {
          if (result.hasDevModeResponse() &&
              result.devModeResponse_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.getDefaultInstance()) {
            result.devModeResponse_ =
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.newBuilder(result.devModeResponse_).mergeFrom(value).buildPartial();
          } else {
            result.devModeResponse_ = value;
          }
          result.hasDevModeResponse = true;
          return this;
        }
        public Builder clearDevModeResponse() {
          result.hasDevModeResponse = false;
          result.devModeResponse_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.getDefaultInstance();
          return this;
        }
      }
      
      static {
        com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
      }
      
      static {
        com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
      }
    }
    
    public static final class Failure extends
        com.google.gwt.dev.protobuf.GeneratedMessage {
      // Use Failure.newBuilder() to construct.
      private Failure() {}
      
      private static final Failure defaultInstance = new Failure();
      public static Failure getDefaultInstance() {
        return defaultInstance;
      }
      
      public Failure getDefaultInstanceForType() {
        return defaultInstance;
      }
      
      public static final com.google.gwt.dev.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Failure_descriptor;
      }
      
      protected com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Failure_fieldAccessorTable;
      }
      
      // optional string message = 1;
      public static final int MESSAGE_FIELD_NUMBER = 1;
      private boolean hasMessage;
      private java.lang.String message_ = "";
      public boolean hasMessage() { return hasMessage; }
      public java.lang.String getMessage() { return message_; }
      
      // optional string stackTrace = 2;
      public static final int STACKTRACE_FIELD_NUMBER = 2;
      private boolean hasStackTrace;
      private java.lang.String stackTrace_ = "";
      public boolean hasStackTrace() { return hasStackTrace; }
      public java.lang.String getStackTrace() { return stackTrace_; }
      
      public final boolean isInitialized() {
        return true;
      }
      
      public void writeTo(com.google.gwt.dev.protobuf.CodedOutputStream output)
                          throws java.io.IOException {
        if (hasMessage()) {
          output.writeString(1, getMessage());
        }
        if (hasStackTrace()) {
          output.writeString(2, getStackTrace());
        }
        getUnknownFields().writeTo(output);
      }
      
      private int memoizedSerializedSize = -1;
      public int getSerializedSize() {
        int size = memoizedSerializedSize;
        if (size != -1) return size;
      
        size = 0;
        if (hasMessage()) {
          size += com.google.gwt.dev.protobuf.CodedOutputStream
            .computeStringSize(1, getMessage());
        }
        if (hasStackTrace()) {
          size += com.google.gwt.dev.protobuf.CodedOutputStream
            .computeStringSize(2, getStackTrace());
        }
        size += getUnknownFields().getSerializedSize();
        memoizedSerializedSize = size;
        return size;
      }
      
      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Failure parseFrom(
          com.google.gwt.dev.protobuf.ByteString data)
          throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
        return newBuilder().mergeFrom(data).buildParsed();
      }
      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Failure parseFrom(
          com.google.gwt.dev.protobuf.ByteString data,
          com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
        return newBuilder().mergeFrom(data, extensionRegistry)
                 .buildParsed();
      }
      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Failure parseFrom(byte[] data)
          throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
        return newBuilder().mergeFrom(data).buildParsed();
      }
      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Failure parseFrom(
          byte[] data,
          com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
        return newBuilder().mergeFrom(data, extensionRegistry)
                 .buildParsed();
      }
      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Failure parseFrom(java.io.InputStream input)
          throws java.io.IOException {
        return newBuilder().mergeFrom(input).buildParsed();
      }
      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Failure parseFrom(
          java.io.InputStream input,
          com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        return newBuilder().mergeFrom(input, extensionRegistry)
                 .buildParsed();
      }
      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Failure parseDelimitedFrom(java.io.InputStream input)
          throws java.io.IOException {
        return newBuilder().mergeDelimitedFrom(input).buildParsed();
      }
      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Failure parseDelimitedFrom(
          java.io.InputStream input,
          com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
                 .buildParsed();
      }
      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Failure parseFrom(
          com.google.gwt.dev.protobuf.CodedInputStream input)
          throws java.io.IOException {
        return newBuilder().mergeFrom(input).buildParsed();
      }
      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Failure parseFrom(
          com.google.gwt.dev.protobuf.CodedInputStream input,
          com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        return newBuilder().mergeFrom(input, extensionRegistry)
                 .buildParsed();
      }
      
      public static Builder newBuilder() { return Builder.create(); }
      public Builder newBuilderForType() { return newBuilder(); }
      public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Failure prototype) {
        return newBuilder().mergeFrom(prototype);
      }
      public Builder toBuilder() { return newBuilder(this); }
      
      public static final class Builder extends
          com.google.gwt.dev.protobuf.GeneratedMessage.Builder<Builder> {
        private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Failure result;
        
        // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Failure.newBuilder()
        private Builder() {}
        
        private static Builder create() {
          Builder builder = new Builder();
          builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Failure();
          return builder;
        }
        
        protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Failure internalGetResult() {
          return result;
        }
        
        public Builder clear() {
          if (result == null) {
            throw new IllegalStateException(
              "Cannot call clear() after build().");
          }
          result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Failure();
          return this;
        }
        
        public Builder clone() {
          return create().mergeFrom(result);
        }
        
        public com.google.gwt.dev.protobuf.Descriptors.Descriptor
            getDescriptorForType() {
          return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Failure.getDescriptor();
        }
        
        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Failure getDefaultInstanceForType() {
          return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Failure.getDefaultInstance();
        }
        
        public boolean isInitialized() {
          return result.isInitialized();
        }
        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Failure build() {
          if (result != null && !isInitialized()) {
            throw newUninitializedMessageException(result);
          }
          return buildPartial();
        }
        
        private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Failure buildParsed()
            throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
          if (!isInitialized()) {
            throw newUninitializedMessageException(
              result).asInvalidProtocolBufferException();
          }
          return buildPartial();
        }
        
        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Failure buildPartial() {
          if (result == null) {
            throw new IllegalStateException(
              "build() has already been called on this Builder.");
          }
          com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Failure returnMe = result;
          result = null;
          return returnMe;
        }
        
        public Builder mergeFrom(com.google.gwt.dev.protobuf.Message other) {
          if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Failure) {
            return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Failure)other);
          } else {
            super.mergeFrom(other);
            return this;
          }
        }
        
        public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Failure other) {
          if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Failure.getDefaultInstance()) return this;
          if (other.hasMessage()) {
            setMessage(other.getMessage());
          }
          if (other.hasStackTrace()) {
            setStackTrace(other.getStackTrace());
          }
          this.mergeUnknownFields(other.getUnknownFields());
          return this;
        }
        
        public Builder mergeFrom(
            com.google.gwt.dev.protobuf.CodedInputStream input,
            com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          com.google.gwt.dev.protobuf.UnknownFieldSet.Builder unknownFields =
            com.google.gwt.dev.protobuf.UnknownFieldSet.newBuilder(
              this.getUnknownFields());
          while (true) {
            int tag = input.readTag();
            switch (tag) {
              case 0:
                this.setUnknownFields(unknownFields.build());
                return this;
              default: {
                if (!parseUnknownField(input, unknownFields,
                                       extensionRegistry, tag)) {
                  this.setUnknownFields(unknownFields.build());
                  return this;
                }
                break;
              }
              case 10: {
                setMessage(input.readString());
                break;
              }
              case 18: {
                setStackTrace(input.readString());
                break;
              }
            }
          }
        }
        
        
        // optional string message = 1;
        public boolean hasMessage() {
          return result.hasMessage();
        }
        public java.lang.String getMessage() {
          return result.getMessage();
        }
        public Builder setMessage(java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  result.hasMessage = true;
          result.message_ = value;
          return this;
        }
        public Builder clearMessage() {
          result.hasMessage = false;
          result.message_ = getDefaultInstance().getMessage();
          return this;
        }
        
        // optional string stackTrace = 2;
        public boolean hasStackTrace() {
          return result.hasStackTrace();
        }
        public java.lang.String getStackTrace() {
          return result.getStackTrace();
        }
        public Builder setStackTrace(java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  result.hasStackTrace = true;
          result.stackTrace_ = value;
          return this;
        }
        public Builder clearStackTrace() {
          result.hasStackTrace = false;
          result.stackTrace_ = getDefaultInstance().getStackTrace();
          return this;
        }
      }
      
      static {
        com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
      }
      
      static {
        com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
      }
    }
    
    // optional string protocolVersion = 1;
    public static final int PROTOCOLVERSION_FIELD_NUMBER = 1;
    private boolean hasProtocolVersion;
    private java.lang.String protocolVersion_ = "";
    public boolean hasProtocolVersion() { return hasProtocolVersion; }
    public java.lang.String getProtocolVersion() { return protocolVersion_; }
    
    // optional .com.google.gwt.dev.shell.remoteui.Message.MessageType messageType = 2;
    public static final int MESSAGETYPE_FIELD_NUMBER = 2;
    private boolean hasMessageType;
    private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.MessageType messageType_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.MessageType.REQUEST;
    public boolean hasMessageType() { return hasMessageType; }
    public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.MessageType getMessageType() { return messageType_; }
    
    // required uint32 messageId = 3;
    public static final int MESSAGEID_FIELD_NUMBER = 3;
    private boolean hasMessageId;
    private int messageId_ = 0;
    public boolean hasMessageId() { return hasMessageId; }
    public int getMessageId() { return messageId_; }
    
    // optional .com.google.gwt.dev.shell.remoteui.Message.Request request = 4;
    public static final int REQUEST_FIELD_NUMBER = 4;
    private boolean hasRequest;
    private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request request_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.getDefaultInstance();
    public boolean hasRequest() { return hasRequest; }
    public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request getRequest() { return request_; }
    
    // optional .com.google.gwt.dev.shell.remoteui.Message.Response response = 5;
    public static final int RESPONSE_FIELD_NUMBER = 5;
    private boolean hasResponse;
    private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response response_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.getDefaultInstance();
    public boolean hasResponse() { return hasResponse; }
    public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response getResponse() { return response_; }
    
    // optional .com.google.gwt.dev.shell.remoteui.Message.Failure failure = 6;
    public static final int FAILURE_FIELD_NUMBER = 6;
    private boolean hasFailure;
    private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Failure failure_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Failure.getDefaultInstance();
    public boolean hasFailure() { return hasFailure; }
    public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Failure getFailure() { return failure_; }
    
    public final boolean isInitialized() {
      if (!hasMessageId) return false;
      if (hasRequest()) {
        if (!getRequest().isInitialized()) return false;
      }
      if (hasResponse()) {
        if (!getResponse().isInitialized()) return false;
      }
      return true;
    }
    
    public void writeTo(com.google.gwt.dev.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      if (hasProtocolVersion()) {
        output.writeString(1, getProtocolVersion());
      }
      if (hasMessageType()) {
        output.writeEnum(2, getMessageType().getNumber());
      }
      if (hasMessageId()) {
        output.writeUInt32(3, getMessageId());
      }
      if (hasRequest()) {
        output.writeMessage(4, getRequest());
      }
      if (hasResponse()) {
        output.writeMessage(5, getResponse());
      }
      if (hasFailure()) {
        output.writeMessage(6, getFailure());
      }
      getUnknownFields().writeTo(output);
    }
    
    private int memoizedSerializedSize = -1;
    public int getSerializedSize() {
      int size = memoizedSerializedSize;
      if (size != -1) return size;
    
      size = 0;
      if (hasProtocolVersion()) {
        size += com.google.gwt.dev.protobuf.CodedOutputStream
          .computeStringSize(1, getProtocolVersion());
      }
      if (hasMessageType()) {
        size += com.google.gwt.dev.protobuf.CodedOutputStream
          .computeEnumSize(2, getMessageType().getNumber());
      }
      if (hasMessageId()) {
        size += com.google.gwt.dev.protobuf.CodedOutputStream
          .computeUInt32Size(3, getMessageId());
      }
      if (hasRequest()) {
        size += com.google.gwt.dev.protobuf.CodedOutputStream
          .computeMessageSize(4, getRequest());
      }
      if (hasResponse()) {
        size += com.google.gwt.dev.protobuf.CodedOutputStream
          .computeMessageSize(5, getResponse());
      }
      if (hasFailure()) {
        size += com.google.gwt.dev.protobuf.CodedOutputStream
          .computeMessageSize(6, getFailure());
      }
      size += getUnknownFields().getSerializedSize();
      memoizedSerializedSize = size;
      return size;
    }
    
    public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message parseFrom(
        com.google.gwt.dev.protobuf.ByteString data)
        throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
      return newBuilder().mergeFrom(data).buildParsed();
    }
    public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message parseFrom(
        com.google.gwt.dev.protobuf.ByteString data,
        com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
      return newBuilder().mergeFrom(data, extensionRegistry)
               .buildParsed();
    }
    public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message parseFrom(byte[] data)
        throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
      return newBuilder().mergeFrom(data).buildParsed();
    }
    public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message parseFrom(
        byte[] data,
        com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
      return newBuilder().mergeFrom(data, extensionRegistry)
               .buildParsed();
    }
    public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return newBuilder().mergeFrom(input).buildParsed();
    }
    public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message parseFrom(
        java.io.InputStream input,
        com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return newBuilder().mergeFrom(input, extensionRegistry)
               .buildParsed();
    }
    public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return newBuilder().mergeDelimitedFrom(input).buildParsed();
    }
    public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message parseDelimitedFrom(
        java.io.InputStream input,
        com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
               .buildParsed();
    }
    public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message parseFrom(
        com.google.gwt.dev.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return newBuilder().mergeFrom(input).buildParsed();
    }
    public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message parseFrom(
        com.google.gwt.dev.protobuf.CodedInputStream input,
        com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return newBuilder().mergeFrom(input, extensionRegistry)
               .buildParsed();
    }
    
    public static Builder newBuilder() { return Builder.create(); }
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message prototype) {
      return newBuilder().mergeFrom(prototype);
    }
    public Builder toBuilder() { return newBuilder(this); }
    
    public static final class Builder extends
        com.google.gwt.dev.protobuf.GeneratedMessage.Builder<Builder> {
      private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message result;
      
      // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.newBuilder()
      private Builder() {}
      
      private static Builder create() {
        Builder builder = new Builder();
        builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message();
        return builder;
      }
      
      protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message internalGetResult() {
        return result;
      }
      
      public Builder clear() {
        if (result == null) {
          throw new IllegalStateException(
            "Cannot call clear() after build().");
        }
        result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message();
        return this;
      }
      
      public Builder clone() {
        return create().mergeFrom(result);
      }
      
      public com.google.gwt.dev.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.getDescriptor();
      }
      
      public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message getDefaultInstanceForType() {
        return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.getDefaultInstance();
      }
      
      public boolean isInitialized() {
        return result.isInitialized();
      }
      public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message build() {
        if (result != null && !isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return buildPartial();
      }
      
      private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message buildParsed()
          throws com.google.gwt.dev.protobuf.InvalidProtocolBufferException {
        if (!isInitialized()) {
          throw newUninitializedMessageException(
            result).asInvalidProtocolBufferException();
        }
        return buildPartial();
      }
      
      public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message buildPartial() {
        if (result == null) {
          throw new IllegalStateException(
            "build() has already been called on this Builder.");
        }
        com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message returnMe = result;
        result = null;
        return returnMe;
      }
      
      public Builder mergeFrom(com.google.gwt.dev.protobuf.Message other) {
        if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message) {
          return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }
      
      public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message other) {
        if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.getDefaultInstance()) return this;
        if (other.hasProtocolVersion()) {
          setProtocolVersion(other.getProtocolVersion());
        }
        if (other.hasMessageType()) {
          setMessageType(other.getMessageType());
        }
        if (other.hasMessageId()) {
          setMessageId(other.getMessageId());
        }
        if (other.hasRequest()) {
          mergeRequest(other.getRequest());
        }
        if (other.hasResponse()) {
          mergeResponse(other.getResponse());
        }
        if (other.hasFailure()) {
          mergeFailure(other.getFailure());
        }
        this.mergeUnknownFields(other.getUnknownFields());
        return this;
      }
      
      public Builder mergeFrom(
          com.google.gwt.dev.protobuf.CodedInputStream input,
          com.google.gwt.dev.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.google.gwt.dev.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.gwt.dev.protobuf.UnknownFieldSet.newBuilder(
            this.getUnknownFields());
        while (true) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              this.setUnknownFields(unknownFields.build());
              return this;
            default: {
              if (!parseUnknownField(input, unknownFields,
                                     extensionRegistry, tag)) {
                this.setUnknownFields(unknownFields.build());
                return this;
              }
              break;
            }
            case 10: {
              setProtocolVersion(input.readString());
              break;
            }
            case 16: {
              int rawValue = input.readEnum();
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.MessageType value = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.MessageType.valueOf(rawValue);
              if (value == null) {
                unknownFields.mergeVarintField(2, rawValue);
              } else {
                setMessageType(value);
              }
              break;
            }
            case 24: {
              setMessageId(input.readUInt32());
              break;
            }
            case 34: {
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.newBuilder();
              if (hasRequest()) {
                subBuilder.mergeFrom(getRequest());
              }
              input.readMessage(subBuilder, extensionRegistry);
              setRequest(subBuilder.buildPartial());
              break;
            }
            case 42: {
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.newBuilder();
              if (hasResponse()) {
                subBuilder.mergeFrom(getResponse());
              }
              input.readMessage(subBuilder, extensionRegistry);
              setResponse(subBuilder.buildPartial());
              break;
            }
            case 50: {
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Failure.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Failure.newBuilder();
              if (hasFailure()) {
                subBuilder.mergeFrom(getFailure());
              }
              input.readMessage(subBuilder, extensionRegistry);
              setFailure(subBuilder.buildPartial());
              break;
            }
          }
        }
      }
      
      
      // optional string protocolVersion = 1;
      public boolean hasProtocolVersion() {
        return result.hasProtocolVersion();
      }
      public java.lang.String getProtocolVersion() {
        return result.getProtocolVersion();
      }
      public Builder setProtocolVersion(java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  result.hasProtocolVersion = true;
        result.protocolVersion_ = value;
        return this;
      }
      public Builder clearProtocolVersion() {
        result.hasProtocolVersion = false;
        result.protocolVersion_ = getDefaultInstance().getProtocolVersion();
        return this;
      }
      
      // optional .com.google.gwt.dev.shell.remoteui.Message.MessageType messageType = 2;
      public boolean hasMessageType() {
        return result.hasMessageType();
      }
      public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.MessageType getMessageType() {
        return result.getMessageType();
      }
      public Builder setMessageType(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.MessageType value) {
        if (value == null) {
          throw new NullPointerException();
        }
        result.hasMessageType = true;
        result.messageType_ = value;
        return this;
      }
      public Builder clearMessageType() {
        result.hasMessageType = false;
        result.messageType_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.MessageType.REQUEST;
        return this;
      }
      
      // required uint32 messageId = 3;
      public boolean hasMessageId() {
        return result.hasMessageId();
      }
      public int getMessageId() {
        return result.getMessageId();
      }
      public Builder setMessageId(int value) {
        result.hasMessageId = true;
        result.messageId_ = value;
        return this;
      }
      public Builder clearMessageId() {
        result.hasMessageId = false;
        result.messageId_ = 0;
        return this;
      }
      
      // optional .com.google.gwt.dev.shell.remoteui.Message.Request request = 4;
      public boolean hasRequest() {
        return result.hasRequest();
      }
      public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request getRequest() {
        return result.getRequest();
      }
      public Builder setRequest(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request value) {
        if (value == null) {
          throw new NullPointerException();
        }
        result.hasRequest = true;
        result.request_ = value;
        return this;
      }
      public Builder setRequest(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.Builder builderForValue) {
        result.hasRequest = true;
        result.request_ = builderForValue.build();
        return this;
      }
      public Builder mergeRequest(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request value) {
        if (result.hasRequest() &&
            result.request_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.getDefaultInstance()) {
          result.request_ =
            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.newBuilder(result.request_).mergeFrom(value).buildPartial();
        } else {
          result.request_ = value;
        }
        result.hasRequest = true;
        return this;
      }
      public Builder clearRequest() {
        result.hasRequest = false;
        result.request_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.getDefaultInstance();
        return this;
      }
      
      // optional .com.google.gwt.dev.shell.remoteui.Message.Response response = 5;
      public boolean hasResponse() {
        return result.hasResponse();
      }
      public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response getResponse() {
        return result.getResponse();
      }
      public Builder setResponse(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response value) {
        if (value == null) {
          throw new NullPointerException();
        }
        result.hasResponse = true;
        result.response_ = value;
        return this;
      }
      public Builder setResponse(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.Builder builderForValue) {
        result.hasResponse = true;
        result.response_ = builderForValue.build();
        return this;
      }
      public Builder mergeResponse(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response value) {
        if (result.hasResponse() &&
            result.response_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.getDefaultInstance()) {
          result.response_ =
            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.newBuilder(result.response_).mergeFrom(value).buildPartial();
        } else {
          result.response_ = value;
        }
        result.hasResponse = true;
        return this;
      }
      public Builder clearResponse() {
        result.hasResponse = false;
        result.response_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.getDefaultInstance();
        return this;
      }
      
      // optional .com.google.gwt.dev.shell.remoteui.Message.Failure failure = 6;
      public boolean hasFailure() {
        return result.hasFailure();
      }
      public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Failure getFailure() {
        return result.getFailure();
      }
      public Builder setFailure(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Failure value) {
        if (value == null) {
          throw new NullPointerException();
        }
        result.hasFailure = true;
        result.failure_ = value;
        return this;
      }
      public Builder setFailure(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Failure.Builder builderForValue) {
        result.hasFailure = true;
        result.failure_ = builderForValue.build();
        return this;
      }
      public Builder mergeFailure(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Failure value) {
        if (result.hasFailure() &&
            result.failure_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Failure.getDefaultInstance()) {
          result.failure_ =
            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Failure.newBuilder(result.failure_).mergeFrom(value).buildPartial();
        } else {
          result.failure_ = value;
        }
        result.hasFailure = true;
        return this;
      }
      public Builder clearFailure() {
        result.hasFailure = false;
        result.failure_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Failure.getDefaultInstance();
        return this;
      }
    }
    
    static {
      com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
    }
    
    static {
      com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
    }
  }
  
  private static com.google.gwt.dev.protobuf.Descriptors.Descriptor
    internal_static_com_google_gwt_dev_shell_remoteui_Message_descriptor;
  private static
    com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_com_google_gwt_dev_shell_remoteui_Message_fieldAccessorTable;
  private static com.google.gwt.dev.protobuf.Descriptors.Descriptor
    internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_descriptor;
  private static
    com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_fieldAccessorTable;
  private static com.google.gwt.dev.protobuf.Descriptors.Descriptor
    internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_descriptor;
  private static
    com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_fieldAccessorTable;
  private static com.google.gwt.dev.protobuf.Descriptors.Descriptor
    internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_CapabilityExchange_descriptor;
  private static
    com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_CapabilityExchange_fieldAccessorTable;
  private static com.google.gwt.dev.protobuf.Descriptors.Descriptor
    internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_descriptor;
  private static
    com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_fieldAccessorTable;
  private static com.google.gwt.dev.protobuf.Descriptors.Descriptor
    internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_ModuleLog_descriptor;
  private static
    com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_ModuleLog_fieldAccessorTable;
  private static com.google.gwt.dev.protobuf.Descriptors.Descriptor
    internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_ServerLog_descriptor;
  private static
    com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_ServerLog_fieldAccessorTable;
  private static com.google.gwt.dev.protobuf.Descriptors.Descriptor
    internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_MainLog_descriptor;
  private static
    com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_MainLog_fieldAccessorTable;
  private static com.google.gwt.dev.protobuf.Descriptors.Descriptor
    internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_LogData_descriptor;
  private static
    com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_LogData_fieldAccessorTable;
  private static com.google.gwt.dev.protobuf.Descriptors.Descriptor
    internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_LogData_HelpInfo_descriptor;
  private static
    com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_LogData_HelpInfo_fieldAccessorTable;
  private static com.google.gwt.dev.protobuf.Descriptors.Descriptor
    internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLogBranch_descriptor;
  private static
    com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLogBranch_fieldAccessorTable;
  private static com.google.gwt.dev.protobuf.Descriptors.Descriptor
    internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLogEntry_descriptor;
  private static
    com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLogEntry_fieldAccessorTable;
  private static com.google.gwt.dev.protobuf.Descriptors.Descriptor
    internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_DisconnectLog_descriptor;
  private static
    com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_DisconnectLog_fieldAccessorTable;
  private static com.google.gwt.dev.protobuf.Descriptors.Descriptor
    internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_Initialize_descriptor;
  private static
    com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_Initialize_fieldAccessorTable;
  private static com.google.gwt.dev.protobuf.Descriptors.Descriptor
    internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_descriptor;
  private static
    com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_fieldAccessorTable;
  private static com.google.gwt.dev.protobuf.Descriptors.Descriptor
    internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_CapabilityExchange_descriptor;
  private static
    com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_CapabilityExchange_fieldAccessorTable;
  private static com.google.gwt.dev.protobuf.Descriptors.Descriptor
    internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_RestartWebServer_descriptor;
  private static
    com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_RestartWebServer_fieldAccessorTable;
  private static com.google.gwt.dev.protobuf.Descriptors.Descriptor
    internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_descriptor;
  private static
    com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_fieldAccessorTable;
  private static com.google.gwt.dev.protobuf.Descriptors.Descriptor
    internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_descriptor;
  private static
    com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_fieldAccessorTable;
  private static com.google.gwt.dev.protobuf.Descriptors.Descriptor
    internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_CapabilityExchange_descriptor;
  private static
    com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_CapabilityExchange_fieldAccessorTable;
  private static com.google.gwt.dev.protobuf.Descriptors.Descriptor
    internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_CapabilityExchange_Capability_descriptor;
  private static
    com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_CapabilityExchange_Capability_fieldAccessorTable;
  private static com.google.gwt.dev.protobuf.Descriptors.Descriptor
    internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_AddLog_descriptor;
  private static
    com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_AddLog_fieldAccessorTable;
  private static com.google.gwt.dev.protobuf.Descriptors.Descriptor
    internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_AddLogBranch_descriptor;
  private static
    com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_AddLogBranch_fieldAccessorTable;
  private static com.google.gwt.dev.protobuf.Descriptors.Descriptor
    internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_descriptor;
  private static
    com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_fieldAccessorTable;
  private static com.google.gwt.dev.protobuf.Descriptors.Descriptor
    internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_CapabilityExchange_descriptor;
  private static
    com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_CapabilityExchange_fieldAccessorTable;
  private static com.google.gwt.dev.protobuf.Descriptors.Descriptor
    internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_CapabilityExchange_Capability_descriptor;
  private static
    com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_CapabilityExchange_Capability_fieldAccessorTable;
  private static com.google.gwt.dev.protobuf.Descriptors.Descriptor
    internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_RestartWebServer_descriptor;
  private static
    com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_RestartWebServer_fieldAccessorTable;
  private static com.google.gwt.dev.protobuf.Descriptors.Descriptor
    internal_static_com_google_gwt_dev_shell_remoteui_Message_Failure_descriptor;
  private static
    com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_com_google_gwt_dev_shell_remoteui_Message_Failure_fieldAccessorTable;
  
  public static com.google.gwt.dev.protobuf.Descriptors.FileDescriptor
      getDescriptor() {
    return descriptor;
  }
  private static com.google.gwt.dev.protobuf.Descriptors.FileDescriptor
      descriptor;
  static {
    java.lang.String[] descriptorData = {
      "\n>core/src/com/google/gwt/dev/shell/remo" +
      "teui/remotemessage.proto\022!com.google.gwt" +
      ".dev.shell.remoteui\"\271\'\n\007Message\022\027\n\017proto" +
      "colVersion\030\001 \001(\t\022K\n\013messageType\030\002 \001(\01626." +
      "com.google.gwt.dev.shell.remoteui.Messag" +
      "e.MessageType\022\021\n\tmessageId\030\003 \002(\r\022C\n\007requ" +
      "est\030\004 \001(\01322.com.google.gwt.dev.shell.rem" +
      "oteui.Message.Request\022E\n\010response\030\005 \001(\0132" +
      "3.com.google.gwt.dev.shell.remoteui.Mess" +
      "age.Response\022C\n\007failure\030\006 \001(\01322.com.goog",
      "le.gwt.dev.shell.remoteui.Message.Failur" +
      "e\032\307\026\n\007Request\022S\n\013serviceType\030\001 \001(\0162>.com" +
      ".google.gwt.dev.shell.remoteui.Message.R" +
      "equest.ServiceType\022W\n\rviewerRequest\030\002 \001(" +
      "\0132@.com.google.gwt.dev.shell.remoteui.Me" +
      "ssage.Request.ViewerRequest\022Y\n\016devModeRe" +
      "quest\030\003 \001(\0132A.com.google.gwt.dev.shell.r" +
      "emoteui.Message.Request.DevModeRequest\032\310" +
      "\020\n\rViewerRequest\022a\n\013requestType\030\001 \001(\0162L." +
      "com.google.gwt.dev.shell.remoteui.Messag",
      "e.Request.ViewerRequest.RequestType\022o\n\022c" +
      "apabilityExchange\030\002 \001(\0132S.com.google.gwt" +
      ".dev.shell.remoteui.Message.Request.View" +
      "erRequest.CapabilityExchange\022W\n\006addLog\030\003" +
      " \001(\0132G.com.google.gwt.dev.shell.remoteui" +
      ".Message.Request.ViewerRequest.AddLog\022c\n" +
      "\014addLogBranch\030\004 \001(\0132M.com.google.gwt.dev" +
      ".shell.remoteui.Message.Request.ViewerRe" +
      "quest.AddLogBranch\022a\n\013addLogEntry\030\005 \001(\0132" +
      "L.com.google.gwt.dev.shell.remoteui.Mess",
      "age.Request.ViewerRequest.AddLogEntry\022e\n" +
      "\rdisconnectLog\030\006 \001(\0132N.com.google.gwt.de" +
      "v.shell.remoteui.Message.Request.ViewerR" +
      "equest.DisconnectLog\022_\n\ninitialize\030\007 \001(\013" +
      "2K.com.google.gwt.dev.shell.remoteui.Mes" +
      "sage.Request.ViewerRequest.Initialize\032\024\n" +
      "\022CapabilityExchange\032\373\004\n\006AddLog\022]\n\004type\030\001" +
      " \001(\0162O.com.google.gwt.dev.shell.remoteui" +
      ".Message.Request.ViewerRequest.AddLog.Lo" +
      "gType\022d\n\tmoduleLog\030\002 \001(\0132Q.com.google.gw",
      "t.dev.shell.remoteui.Message.Request.Vie" +
      "werRequest.AddLog.ModuleLog\022d\n\tserverLog" +
      "\030\003 \001(\0132Q.com.google.gwt.dev.shell.remote" +
      "ui.Message.Request.ViewerRequest.AddLog." +
      "ServerLog\022`\n\007mainLog\030\004 \001(\0132O.com.google." +
      "gwt.dev.shell.remoteui.Message.Request.V" +
      "iewerRequest.AddLog.MainLog\032\177\n\tModuleLog" +
      "\022\014\n\004name\030\001 \002(\t\022\014\n\004icon\030\002 \001(\014\022\022\n\nsessionK" +
      "ey\030\003 \001(\t\022\021\n\tuserAgent\030\004 \001(\t\022\013\n\003url\030\005 \001(\t" +
      "\022\016\n\006tabKey\030\006 \001(\t\022\022\n\nremoteHost\030\007 \001(\t\032\'\n\t",
      "ServerLog\022\014\n\004name\030\001 \002(\t\022\014\n\004icon\030\002 \001(\014\032\t\n" +
      "\007MainLog\"/\n\007LogType\022\010\n\004MAIN\020\000\022\n\n\006MODULE\020" +
      "\001\022\016\n\nWEB_SERVER\020\002\032\336\001\n\007LogData\022\017\n\007summary" +
      "\030\001 \002(\t\022\r\n\005level\030\002 \001(\t\022\026\n\016needsAttention\030" +
      "\003 \001(\010\022\017\n\007details\030\004 \001(\t\022c\n\010helpInfo\030\005 \001(\013" +
      "2Q.com.google.gwt.dev.shell.remoteui.Mes" +
      "sage.Request.ViewerRequest.LogData.HelpI" +
      "nfo\032%\n\010HelpInfo\022\013\n\003url\030\001 \001(\t\022\014\n\004text\030\002 \001" +
      "(\t\032\231\001\n\014AddLogBranch\022\027\n\017parentLogHandle\030\001" +
      " \002(\r\022\025\n\rindexInParent\030\002 \002(\r\022Y\n\007logData\030\003",
      " \002(\0132H.com.google.gwt.dev.shell.remoteui" +
      ".Message.Request.ViewerRequest.LogData\032\217" +
      "\001\n\013AddLogEntry\022\021\n\tlogHandle\030\001 \002(\r\022\022\n\nind" +
      "exInLog\030\002 \002(\r\022Y\n\007logData\030\003 \002(\0132H.com.goo" +
      "gle.gwt.dev.shell.remoteui.Message.Reque" +
      "st.ViewerRequest.LogData\032\"\n\rDisconnectLo" +
      "g\022\021\n\tlogHandle\030\001 \002(\r\0323\n\nInitialize\022\020\n\010cl" +
      "ientId\030\001 \001(\t\022\023\n\013startupURLs\030\002 \003(\t\"~\n\013Req" +
      "uestType\022\027\n\023CAPABILITY_EXCHANGE\020\000\022\013\n\007ADD" +
      "_LOG\020\001\022\022\n\016ADD_LOG_BRANCH\020\002\022\021\n\rADD_LOG_EN",
      "TRY\020\003\022\022\n\016DISCONNECT_LOG\020\004\022\016\n\nINITIALIZE\020" +
      "\005\032\276\003\n\016DevModeRequest\022b\n\013requestType\030\001 \001(" +
      "\0162M.com.google.gwt.dev.shell.remoteui.Me" +
      "ssage.Request.DevModeRequest.RequestType" +
      "\022p\n\022capabilityExchange\030\002 \001(\0132T.com.googl" +
      "e.gwt.dev.shell.remoteui.Message.Request" +
      ".DevModeRequest.CapabilityExchange\022l\n\020re" +
      "startWebServer\030\003 \001(\0132R.com.google.gwt.de" +
      "v.shell.remoteui.Message.Request.DevMode" +
      "Request.RestartWebServer\032\024\n\022CapabilityEx",
      "change\032\022\n\020RestartWebServer\">\n\013RequestTyp" +
      "e\022\027\n\023CAPABILITY_EXCHANGE\020\000\022\026\n\022RESTART_WE" +
      "B_SERVER\020\001\"\'\n\013ServiceType\022\n\n\006VIEWER\020\000\022\014\n" +
      "\010DEV_MODE\020\001\032\262\r\n\010Response\022Z\n\016viewerRespon" +
      "se\030\001 \001(\0132B.com.google.gwt.dev.shell.remo" +
      "teui.Message.Response.ViewerResponse\022\\\n\017" +
      "devModeResponse\030\002 \001(\0132C.com.google.gwt.d" +
      "ev.shell.remoteui.Message.Response.DevMo" +
      "deResponse\032\265\006\n\016ViewerResponse\022e\n\014respons" +
      "eType\030\001 \001(\0162O.com.google.gwt.dev.shell.r",
      "emoteui.Message.Response.ViewerResponse." +
      "ResponseType\022q\n\022capabilityExchange\030\002 \001(\013" +
      "2U.com.google.gwt.dev.shell.remoteui.Mes" +
      "sage.Response.ViewerResponse.CapabilityE" +
      "xchange\022Y\n\006addLog\030\003 \001(\0132I.com.google.gwt" +
      ".dev.shell.remoteui.Message.Response.Vie" +
      "werResponse.AddLog\022e\n\014addLogBranch\030\004 \001(\013" +
      "2O.com.google.gwt.dev.shell.remoteui.Mes" +
      "sage.Response.ViewerResponse.AddLogBranc" +
      "h\032\374\001\n\022CapabilityExchange\022v\n\014capabilities",
      "\030\002 \003(\0132`.com.google.gwt.dev.shell.remote" +
      "ui.Message.Response.ViewerResponse.Capab" +
      "ilityExchange.Capability\032n\n\nCapability\022`" +
      "\n\ncapability\030\001 \001(\0162L.com.google.gwt.dev." +
      "shell.remoteui.Message.Request.ViewerReq" +
      "uest.RequestType\032\033\n\006AddLog\022\021\n\tlogHandle\030" +
      "\001 \002(\r\032!\n\014AddLogBranch\022\021\n\tlogHandle\030\001 \002(\r" +
      "\"H\n\014ResponseType\022\027\n\023CAPABILITY_EXCHANGE\020" +
      "\000\022\013\n\007ADD_LOG\020\001\022\022\n\016ADD_LOG_BRANCH\020\002\032\263\005\n\017D" +
      "evModeResponse\022f\n\014responseType\030\001 \001(\0162P.c",
      "om.google.gwt.dev.shell.remoteui.Message" +
      ".Response.DevModeResponse.ResponseType\022r" +
      "\n\022capabilityExchange\030\002 \001(\0132V.com.google." +
      "gwt.dev.shell.remoteui.Message.Response." +
      "DevModeResponse.CapabilityExchange\022n\n\020re" +
      "startWebServer\030\003 \001(\0132T.com.google.gwt.de" +
      "v.shell.remoteui.Message.Response.DevMod" +
      "eResponse.RestartWebServer\032\376\001\n\022Capabilit" +
      "yExchange\022w\n\014capabilities\030\002 \003(\0132a.com.go" +
      "ogle.gwt.dev.shell.remoteui.Message.Resp",
      "onse.DevModeResponse.CapabilityExchange." +
      "Capability\032o\n\nCapability\022a\n\ncapability\030\001" +
      " \001(\0162M.com.google.gwt.dev.shell.remoteui" +
      ".Message.Request.DevModeRequest.RequestT" +
      "ype\032\022\n\020RestartWebServer\"?\n\014ResponseType\022" +
      "\027\n\023CAPABILITY_EXCHANGE\020\000\022\026\n\022RESTART_WEB_" +
      "SERVER\020\001\032.\n\007Failure\022\017\n\007message\030\001 \001(\t\022\022\n\n" +
      "stackTrace\030\002 \001(\t\"5\n\013MessageType\022\013\n\007REQUE" +
      "ST\020\000\022\014\n\010RESPONSE\020\001\022\013\n\007FAILURE\020\002B\024B\022Remot" +
      "eMessageProto"
    };
    com.google.gwt.dev.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
      new com.google.gwt.dev.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
        public com.google.gwt.dev.protobuf.ExtensionRegistry assignDescriptors(
            com.google.gwt.dev.protobuf.Descriptors.FileDescriptor root) {
          descriptor = root;
          internal_static_com_google_gwt_dev_shell_remoteui_Message_descriptor =
            getDescriptor().getMessageTypes().get(0);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_fieldAccessorTable = new
            com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_com_google_gwt_dev_shell_remoteui_Message_descriptor,
              new java.lang.String[] { "ProtocolVersion", "MessageType", "MessageId", "Request", "Response", "Failure", },
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.class,
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Builder.class);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_descriptor =
            internal_static_com_google_gwt_dev_shell_remoteui_Message_descriptor.getNestedTypes().get(0);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_fieldAccessorTable = new
            com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_descriptor,
              new java.lang.String[] { "ServiceType", "ViewerRequest", "DevModeRequest", },
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.class,
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.Builder.class);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_descriptor =
            internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_descriptor.getNestedTypes().get(0);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_fieldAccessorTable = new
            com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_descriptor,
              new java.lang.String[] { "RequestType", "CapabilityExchange", "AddLog", "AddLogBranch", "AddLogEntry", "DisconnectLog", "Initialize", },
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.class,
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Builder.class);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_CapabilityExchange_descriptor =
            internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_descriptor.getNestedTypes().get(0);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_CapabilityExchange_fieldAccessorTable = new
            com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_CapabilityExchange_descriptor,
              new java.lang.String[] { },
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange.class,
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange.Builder.class);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_descriptor =
            internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_descriptor.getNestedTypes().get(1);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_fieldAccessorTable = new
            com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_descriptor,
              new java.lang.String[] { "Type", "ModuleLog", "ServerLog", "MainLog", },
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.class,
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.Builder.class);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_ModuleLog_descriptor =
            internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_descriptor.getNestedTypes().get(0);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_ModuleLog_fieldAccessorTable = new
            com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_ModuleLog_descriptor,
              new java.lang.String[] { "Name", "Icon", "SessionKey", "UserAgent", "Url", "TabKey", "RemoteHost", },
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog.class,
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog.Builder.class);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_ServerLog_descriptor =
            internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_descriptor.getNestedTypes().get(1);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_ServerLog_fieldAccessorTable = new
            com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_ServerLog_descriptor,
              new java.lang.String[] { "Name", "Icon", },
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog.class,
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog.Builder.class);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_MainLog_descriptor =
            internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_descriptor.getNestedTypes().get(2);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_MainLog_fieldAccessorTable = new
            com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_MainLog_descriptor,
              new java.lang.String[] { },
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog.class,
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog.Builder.class);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_LogData_descriptor =
            internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_descriptor.getNestedTypes().get(2);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_LogData_fieldAccessorTable = new
            com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_LogData_descriptor,
              new java.lang.String[] { "Summary", "Level", "NeedsAttention", "Details", "HelpInfo", },
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.class,
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.Builder.class);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_LogData_HelpInfo_descriptor =
            internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_LogData_descriptor.getNestedTypes().get(0);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_LogData_HelpInfo_fieldAccessorTable = new
            com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_LogData_HelpInfo_descriptor,
              new java.lang.String[] { "Url", "Text", },
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo.class,
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo.Builder.class);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLogBranch_descriptor =
            internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_descriptor.getNestedTypes().get(3);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLogBranch_fieldAccessorTable = new
            com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLogBranch_descriptor,
              new java.lang.String[] { "ParentLogHandle", "IndexInParent", "LogData", },
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch.class,
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch.Builder.class);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLogEntry_descriptor =
            internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_descriptor.getNestedTypes().get(4);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLogEntry_fieldAccessorTable = new
            com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLogEntry_descriptor,
              new java.lang.String[] { "LogHandle", "IndexInLog", "LogData", },
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry.class,
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry.Builder.class);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_DisconnectLog_descriptor =
            internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_descriptor.getNestedTypes().get(5);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_DisconnectLog_fieldAccessorTable = new
            com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_DisconnectLog_descriptor,
              new java.lang.String[] { "LogHandle", },
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog.class,
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog.Builder.class);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_Initialize_descriptor =
            internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_descriptor.getNestedTypes().get(6);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_Initialize_fieldAccessorTable = new
            com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_Initialize_descriptor,
              new java.lang.String[] { "ClientId", "StartupURLs", },
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Initialize.class,
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Initialize.Builder.class);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_descriptor =
            internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_descriptor.getNestedTypes().get(1);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_fieldAccessorTable = new
            com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_descriptor,
              new java.lang.String[] { "RequestType", "CapabilityExchange", "RestartWebServer", },
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.class,
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.Builder.class);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_CapabilityExchange_descriptor =
            internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_descriptor.getNestedTypes().get(0);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_CapabilityExchange_fieldAccessorTable = new
            com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_CapabilityExchange_descriptor,
              new java.lang.String[] { },
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange.class,
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange.Builder.class);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_RestartWebServer_descriptor =
            internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_descriptor.getNestedTypes().get(1);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_RestartWebServer_fieldAccessorTable = new
            com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_RestartWebServer_descriptor,
              new java.lang.String[] { },
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer.class,
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer.Builder.class);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_descriptor =
            internal_static_com_google_gwt_dev_shell_remoteui_Message_descriptor.getNestedTypes().get(1);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_fieldAccessorTable = new
            com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_descriptor,
              new java.lang.String[] { "ViewerResponse", "DevModeResponse", },
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.class,
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.Builder.class);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_descriptor =
            internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_descriptor.getNestedTypes().get(0);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_fieldAccessorTable = new
            com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_descriptor,
              new java.lang.String[] { "ResponseType", "CapabilityExchange", "AddLog", "AddLogBranch", },
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.class,
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.Builder.class);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_CapabilityExchange_descriptor =
            internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_descriptor.getNestedTypes().get(0);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_CapabilityExchange_fieldAccessorTable = new
            com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_CapabilityExchange_descriptor,
              new java.lang.String[] { "Capabilities", },
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.class,
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Builder.class);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_CapabilityExchange_Capability_descriptor =
            internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_CapabilityExchange_descriptor.getNestedTypes().get(0);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_CapabilityExchange_Capability_fieldAccessorTable = new
            com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_CapabilityExchange_Capability_descriptor,
              new java.lang.String[] { "Capability", },
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability.class,
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability.Builder.class);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_AddLog_descriptor =
            internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_descriptor.getNestedTypes().get(1);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_AddLog_fieldAccessorTable = new
            com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_AddLog_descriptor,
              new java.lang.String[] { "LogHandle", },
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog.class,
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog.Builder.class);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_AddLogBranch_descriptor =
            internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_descriptor.getNestedTypes().get(2);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_AddLogBranch_fieldAccessorTable = new
            com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_AddLogBranch_descriptor,
              new java.lang.String[] { "LogHandle", },
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch.class,
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch.Builder.class);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_descriptor =
            internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_descriptor.getNestedTypes().get(1);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_fieldAccessorTable = new
            com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_descriptor,
              new java.lang.String[] { "ResponseType", "CapabilityExchange", "RestartWebServer", },
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.class,
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.Builder.class);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_CapabilityExchange_descriptor =
            internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_descriptor.getNestedTypes().get(0);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_CapabilityExchange_fieldAccessorTable = new
            com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_CapabilityExchange_descriptor,
              new java.lang.String[] { "Capabilities", },
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.class,
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Builder.class);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_CapabilityExchange_Capability_descriptor =
            internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_CapabilityExchange_descriptor.getNestedTypes().get(0);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_CapabilityExchange_Capability_fieldAccessorTable = new
            com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_CapabilityExchange_Capability_descriptor,
              new java.lang.String[] { "Capability", },
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability.class,
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability.Builder.class);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_RestartWebServer_descriptor =
            internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_descriptor.getNestedTypes().get(1);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_RestartWebServer_fieldAccessorTable = new
            com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_RestartWebServer_descriptor,
              new java.lang.String[] { },
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer.class,
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer.Builder.class);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Failure_descriptor =
            internal_static_com_google_gwt_dev_shell_remoteui_Message_descriptor.getNestedTypes().get(2);
          internal_static_com_google_gwt_dev_shell_remoteui_Message_Failure_fieldAccessorTable = new
            com.google.gwt.dev.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_com_google_gwt_dev_shell_remoteui_Message_Failure_descriptor,
              new java.lang.String[] { "Message", "StackTrace", },
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Failure.class,
              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Failure.Builder.class);
          return null;
        }
      };
    com.google.gwt.dev.protobuf.Descriptors.FileDescriptor
      .internalBuildGeneratedFileFrom(descriptorData,
        new com.google.gwt.dev.protobuf.Descriptors.FileDescriptor[] {
        }, assigner);
  }
  
  public static void internalForceInit() {}
}
