// Generated by the protocol buffer compiler.  DO NOT EDIT!
// source: general.proto

package ThingModel.Proto;

public final class General {
  private General() {}
  public static void registerAllExtensions(
      com.google.protobuf.ExtensionRegistry registry) {
  }
  public interface PropertyOrBuilder
      extends com.google.protobuf.MessageOrBuilder {

    // required int32 string_key = 1;
    /**
     * <code>required int32 string_key = 1;</code>
     */
    boolean hasStringKey();
    /**
     * <code>required int32 string_key = 1;</code>
     */
    int getStringKey();

    // required .ThingModel.Proto.Property.Type type = 2 [default = STRING];
    /**
     * <code>required .ThingModel.Proto.Property.Type type = 2 [default = STRING];</code>
     */
    boolean hasType();
    /**
     * <code>required .ThingModel.Proto.Property.Type type = 2 [default = STRING];</code>
     */
    ThingModel.Proto.General.Property.Type getType();

    // optional .ThingModel.Proto.Property.Location location_value = 3;
    /**
     * <code>optional .ThingModel.Proto.Property.Location location_value = 3;</code>
     */
    boolean hasLocationValue();
    /**
     * <code>optional .ThingModel.Proto.Property.Location location_value = 3;</code>
     */
    ThingModel.Proto.General.Property.Location getLocationValue();
    /**
     * <code>optional .ThingModel.Proto.Property.Location location_value = 3;</code>
     */
    ThingModel.Proto.General.Property.LocationOrBuilder getLocationValueOrBuilder();

    // optional .ThingModel.Proto.Property.String string_value = 4;
    /**
     * <code>optional .ThingModel.Proto.Property.String string_value = 4;</code>
     */
    boolean hasStringValue();
    /**
     * <code>optional .ThingModel.Proto.Property.String string_value = 4;</code>
     */
    ThingModel.Proto.General.Property.String getStringValue();
    /**
     * <code>optional .ThingModel.Proto.Property.String string_value = 4;</code>
     */
    ThingModel.Proto.General.Property.StringOrBuilder getStringValueOrBuilder();

    // optional double double_value = 5;
    /**
     * <code>optional double double_value = 5;</code>
     */
    boolean hasDoubleValue();
    /**
     * <code>optional double double_value = 5;</code>
     */
    double getDoubleValue();

    // optional int32 int_value = 6;
    /**
     * <code>optional int32 int_value = 6;</code>
     */
    boolean hasIntValue();
    /**
     * <code>optional int32 int_value = 6;</code>
     */
    int getIntValue();

    // optional bool boolean_value = 7;
    /**
     * <code>optional bool boolean_value = 7;</code>
     */
    boolean hasBooleanValue();
    /**
     * <code>optional bool boolean_value = 7;</code>
     */
    boolean getBooleanValue();

    // optional int64 datetime_value = 8;
    /**
     * <code>optional int64 datetime_value = 8;</code>
     */
    boolean hasDatetimeValue();
    /**
     * <code>optional int64 datetime_value = 8;</code>
     */
    long getDatetimeValue();
  }
  /**
   * Protobuf type {@code ThingModel.Proto.Property}
   */
  public static final class Property extends
      com.google.protobuf.GeneratedMessage
      implements PropertyOrBuilder {
    // Use Property.newBuilder() to construct.
    private Property(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
      super(builder);
      this.unknownFields = builder.getUnknownFields();
    }
    private Property(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

    private static final Property defaultInstance;
    public static Property getDefaultInstance() {
      return defaultInstance;
    }

    public Property getDefaultInstanceForType() {
      return defaultInstance;
    }

    private final com.google.protobuf.UnknownFieldSet unknownFields;
    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
      return this.unknownFields;
    }
    private Property(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      initFields();
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            default: {
              if (!parseUnknownField(input, unknownFields,
                                     extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
            case 8: {
              bitField0_ |= 0x00000001;
              stringKey_ = input.readInt32();
              break;
            }
            case 16: {
              int rawValue = input.readEnum();
              ThingModel.Proto.General.Property.Type value = ThingModel.Proto.General.Property.Type.valueOf(rawValue);
              if (value == null) {
                unknownFields.mergeVarintField(2, rawValue);
              } else {
                bitField0_ |= 0x00000002;
                type_ = value;
              }
              break;
            }
            case 26: {
              ThingModel.Proto.General.Property.Location.Builder subBuilder = null;
              if (((bitField0_ & 0x00000004) == 0x00000004)) {
                subBuilder = locationValue_.toBuilder();
              }
              locationValue_ = input.readMessage(ThingModel.Proto.General.Property.Location.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(locationValue_);
                locationValue_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000004;
              break;
            }
            case 34: {
              ThingModel.Proto.General.Property.String.Builder subBuilder = null;
              if (((bitField0_ & 0x00000008) == 0x00000008)) {
                subBuilder = stringValue_.toBuilder();
              }
              stringValue_ = input.readMessage(ThingModel.Proto.General.Property.String.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(stringValue_);
                stringValue_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000008;
              break;
            }
            case 41: {
              bitField0_ |= 0x00000010;
              doubleValue_ = input.readDouble();
              break;
            }
            case 48: {
              bitField0_ |= 0x00000020;
              intValue_ = input.readInt32();
              break;
            }
            case 56: {
              bitField0_ |= 0x00000040;
              booleanValue_ = input.readBool();
              break;
            }
            case 64: {
              bitField0_ |= 0x00000080;
              datetimeValue_ = input.readInt64();
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e.getMessage()).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return ThingModel.Proto.General.internal_static_ThingModel_Proto_Property_descriptor;
    }

    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return ThingModel.Proto.General.internal_static_ThingModel_Proto_Property_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              ThingModel.Proto.General.Property.class, ThingModel.Proto.General.Property.Builder.class);
    }

    public static com.google.protobuf.Parser<Property> PARSER =
        new com.google.protobuf.AbstractParser<Property>() {
      public Property parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new Property(input, extensionRegistry);
      }
    };

    @java.lang.Override
    public com.google.protobuf.Parser<Property> getParserForType() {
      return PARSER;
    }

    /**
     * Protobuf enum {@code ThingModel.Proto.Property.Type}
     */
    public enum Type
        implements com.google.protobuf.ProtocolMessageEnum {
      /**
       * <code>LOCATION_POINT = 0;</code>
       */
      LOCATION_POINT(0, 0),
      /**
       * <code>LOCATION_LATLNG = 1;</code>
       */
      LOCATION_LATLNG(1, 1),
      /**
       * <code>LOCATION_EQUATORIAL = 2;</code>
       */
      LOCATION_EQUATORIAL(2, 2),
      /**
       * <code>STRING = 3;</code>
       */
      STRING(3, 3),
      /**
       * <code>DOUBLE = 4;</code>
       */
      DOUBLE(4, 4),
      /**
       * <code>INT = 5;</code>
       */
      INT(5, 5),
      /**
       * <code>BOOLEAN = 6;</code>
       */
      BOOLEAN(6, 6),
      /**
       * <code>DATETIME = 7;</code>
       */
      DATETIME(7, 7),
      ;

      /**
       * <code>LOCATION_POINT = 0;</code>
       */
      public static final int LOCATION_POINT_VALUE = 0;
      /**
       * <code>LOCATION_LATLNG = 1;</code>
       */
      public static final int LOCATION_LATLNG_VALUE = 1;
      /**
       * <code>LOCATION_EQUATORIAL = 2;</code>
       */
      public static final int LOCATION_EQUATORIAL_VALUE = 2;
      /**
       * <code>STRING = 3;</code>
       */
      public static final int STRING_VALUE = 3;
      /**
       * <code>DOUBLE = 4;</code>
       */
      public static final int DOUBLE_VALUE = 4;
      /**
       * <code>INT = 5;</code>
       */
      public static final int INT_VALUE = 5;
      /**
       * <code>BOOLEAN = 6;</code>
       */
      public static final int BOOLEAN_VALUE = 6;
      /**
       * <code>DATETIME = 7;</code>
       */
      public static final int DATETIME_VALUE = 7;


      public final int getNumber() { return value; }

      public static Type valueOf(int value) {
        switch (value) {
          case 0: return LOCATION_POINT;
          case 1: return LOCATION_LATLNG;
          case 2: return LOCATION_EQUATORIAL;
          case 3: return STRING;
          case 4: return DOUBLE;
          case 5: return INT;
          case 6: return BOOLEAN;
          case 7: return DATETIME;
          default: return null;
        }
      }

      public static com.google.protobuf.Internal.EnumLiteMap<Type>
          internalGetValueMap() {
        return internalValueMap;
      }
      private static com.google.protobuf.Internal.EnumLiteMap<Type>
          internalValueMap =
            new com.google.protobuf.Internal.EnumLiteMap<Type>() {
              public Type findValueByNumber(int number) {
                return Type.valueOf(number);
              }
            };

      public final com.google.protobuf.Descriptors.EnumValueDescriptor
          getValueDescriptor() {
        return getDescriptor().getValues().get(index);
      }
      public final com.google.protobuf.Descriptors.EnumDescriptor
          getDescriptorForType() {
        return getDescriptor();
      }
      public static final com.google.protobuf.Descriptors.EnumDescriptor
          getDescriptor() {
        return ThingModel.Proto.General.Property.getDescriptor().getEnumTypes().get(0);
      }

      private static final Type[] VALUES = values();

      public static Type valueOf(
          com.google.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 Type(int index, int value) {
        this.index = index;
        this.value = value;
      }

      // @@protoc_insertion_point(enum_scope:ThingModel.Proto.Property.Type)
    }

    public interface LocationOrBuilder
        extends com.google.protobuf.MessageOrBuilder {

      // required double x = 1 [default = 0];
      /**
       * <code>required double x = 1 [default = 0];</code>
       */
      boolean hasX();
      /**
       * <code>required double x = 1 [default = 0];</code>
       */
      double getX();

      // required double y = 2 [default = 0];
      /**
       * <code>required double y = 2 [default = 0];</code>
       */
      boolean hasY();
      /**
       * <code>required double y = 2 [default = 0];</code>
       */
      double getY();

      // optional double z = 3 [default = 0];
      /**
       * <code>optional double z = 3 [default = 0];</code>
       */
      boolean hasZ();
      /**
       * <code>optional double z = 3 [default = 0];</code>
       */
      double getZ();

      // optional int32 string_system = 4;
      /**
       * <code>optional int32 string_system = 4;</code>
       *
       * <pre>
       * WGS84 by default
       * </pre>
       */
      boolean hasStringSystem();
      /**
       * <code>optional int32 string_system = 4;</code>
       *
       * <pre>
       * WGS84 by default
       * </pre>
       */
      int getStringSystem();

      // optional bool z_null = 5 [default = false];
      /**
       * <code>optional bool z_null = 5 [default = false];</code>
       *
       * <pre>
       * When the z attribute is not present
       * </pre>
       */
      boolean hasZNull();
      /**
       * <code>optional bool z_null = 5 [default = false];</code>
       *
       * <pre>
       * When the z attribute is not present
       * </pre>
       */
      boolean getZNull();
    }
    /**
     * Protobuf type {@code ThingModel.Proto.Property.Location}
     */
    public static final class Location extends
        com.google.protobuf.GeneratedMessage
        implements LocationOrBuilder {
      // Use Location.newBuilder() to construct.
      private Location(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
        super(builder);
        this.unknownFields = builder.getUnknownFields();
      }
      private Location(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

      private static final Location defaultInstance;
      public static Location getDefaultInstance() {
        return defaultInstance;
      }

      public Location getDefaultInstanceForType() {
        return defaultInstance;
      }

      private final com.google.protobuf.UnknownFieldSet unknownFields;
      @java.lang.Override
      public final com.google.protobuf.UnknownFieldSet
          getUnknownFields() {
        return this.unknownFields;
      }
      private Location(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        initFields();
        int mutable_bitField0_ = 0;
        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
            com.google.protobuf.UnknownFieldSet.newBuilder();
        try {
          boolean done = false;
          while (!done) {
            int tag = input.readTag();
            switch (tag) {
              case 0:
                done = true;
                break;
              default: {
                if (!parseUnknownField(input, unknownFields,
                                       extensionRegistry, tag)) {
                  done = true;
                }
                break;
              }
              case 9: {
                bitField0_ |= 0x00000001;
                x_ = input.readDouble();
                break;
              }
              case 17: {
                bitField0_ |= 0x00000002;
                y_ = input.readDouble();
                break;
              }
              case 25: {
                bitField0_ |= 0x00000004;
                z_ = input.readDouble();
                break;
              }
              case 32: {
                bitField0_ |= 0x00000008;
                stringSystem_ = input.readInt32();
                break;
              }
              case 40: {
                bitField0_ |= 0x00000010;
                zNull_ = input.readBool();
                break;
              }
            }
          }
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          throw e.setUnfinishedMessage(this);
        } catch (java.io.IOException e) {
          throw new com.google.protobuf.InvalidProtocolBufferException(
              e.getMessage()).setUnfinishedMessage(this);
        } finally {
          this.unknownFields = unknownFields.build();
          makeExtensionsImmutable();
        }
      }
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return ThingModel.Proto.General.internal_static_ThingModel_Proto_Property_Location_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return ThingModel.Proto.General.internal_static_ThingModel_Proto_Property_Location_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                ThingModel.Proto.General.Property.Location.class, ThingModel.Proto.General.Property.Location.Builder.class);
      }

      public static com.google.protobuf.Parser<Location> PARSER =
          new com.google.protobuf.AbstractParser<Location>() {
        public Location parsePartialFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return new Location(input, extensionRegistry);
        }
      };

      @java.lang.Override
      public com.google.protobuf.Parser<Location> getParserForType() {
        return PARSER;
      }

      private int bitField0_;
      // required double x = 1 [default = 0];
      public static final int X_FIELD_NUMBER = 1;
      private double x_;
      /**
       * <code>required double x = 1 [default = 0];</code>
       */
      public boolean hasX() {
        return ((bitField0_ & 0x00000001) == 0x00000001);
      }
      /**
       * <code>required double x = 1 [default = 0];</code>
       */
      public double getX() {
        return x_;
      }

      // required double y = 2 [default = 0];
      public static final int Y_FIELD_NUMBER = 2;
      private double y_;
      /**
       * <code>required double y = 2 [default = 0];</code>
       */
      public boolean hasY() {
        return ((bitField0_ & 0x00000002) == 0x00000002);
      }
      /**
       * <code>required double y = 2 [default = 0];</code>
       */
      public double getY() {
        return y_;
      }

      // optional double z = 3 [default = 0];
      public static final int Z_FIELD_NUMBER = 3;
      private double z_;
      /**
       * <code>optional double z = 3 [default = 0];</code>
       */
      public boolean hasZ() {
        return ((bitField0_ & 0x00000004) == 0x00000004);
      }
      /**
       * <code>optional double z = 3 [default = 0];</code>
       */
      public double getZ() {
        return z_;
      }

      // optional int32 string_system = 4;
      public static final int STRING_SYSTEM_FIELD_NUMBER = 4;
      private int stringSystem_;
      /**
       * <code>optional int32 string_system = 4;</code>
       *
       * <pre>
       * WGS84 by default
       * </pre>
       */
      public boolean hasStringSystem() {
        return ((bitField0_ & 0x00000008) == 0x00000008);
      }
      /**
       * <code>optional int32 string_system = 4;</code>
       *
       * <pre>
       * WGS84 by default
       * </pre>
       */
      public int getStringSystem() {
        return stringSystem_;
      }

      // optional bool z_null = 5 [default = false];
      public static final int Z_NULL_FIELD_NUMBER = 5;
      private boolean zNull_;
      /**
       * <code>optional bool z_null = 5 [default = false];</code>
       *
       * <pre>
       * When the z attribute is not present
       * </pre>
       */
      public boolean hasZNull() {
        return ((bitField0_ & 0x00000010) == 0x00000010);
      }
      /**
       * <code>optional bool z_null = 5 [default = false];</code>
       *
       * <pre>
       * When the z attribute is not present
       * </pre>
       */
      public boolean getZNull() {
        return zNull_;
      }

      private void initFields() {
        x_ = 0D;
        y_ = 0D;
        z_ = 0D;
        stringSystem_ = 0;
        zNull_ = false;
      }
      private byte memoizedIsInitialized = -1;
      public final boolean isInitialized() {
        byte isInitialized = memoizedIsInitialized;
        if (isInitialized != -1) return isInitialized == 1;

        if (!hasX()) {
          memoizedIsInitialized = 0;
          return false;
        }
        if (!hasY()) {
          memoizedIsInitialized = 0;
          return false;
        }
        memoizedIsInitialized = 1;
        return true;
      }

      public void writeTo(com.google.protobuf.CodedOutputStream output)
                          throws java.io.IOException {
        getSerializedSize();
        if (((bitField0_ & 0x00000001) == 0x00000001)) {
          output.writeDouble(1, x_);
        }
        if (((bitField0_ & 0x00000002) == 0x00000002)) {
          output.writeDouble(2, y_);
        }
        if (((bitField0_ & 0x00000004) == 0x00000004)) {
          output.writeDouble(3, z_);
        }
        if (((bitField0_ & 0x00000008) == 0x00000008)) {
          output.writeInt32(4, stringSystem_);
        }
        if (((bitField0_ & 0x00000010) == 0x00000010)) {
          output.writeBool(5, zNull_);
        }
        getUnknownFields().writeTo(output);
      }

      private int memoizedSerializedSize = -1;
      public int getSerializedSize() {
        int size = memoizedSerializedSize;
        if (size != -1) return size;

        size = 0;
        if (((bitField0_ & 0x00000001) == 0x00000001)) {
          size += com.google.protobuf.CodedOutputStream
            .computeDoubleSize(1, x_);
        }
        if (((bitField0_ & 0x00000002) == 0x00000002)) {
          size += com.google.protobuf.CodedOutputStream
            .computeDoubleSize(2, y_);
        }
        if (((bitField0_ & 0x00000004) == 0x00000004)) {
          size += com.google.protobuf.CodedOutputStream
            .computeDoubleSize(3, z_);
        }
        if (((bitField0_ & 0x00000008) == 0x00000008)) {
          size += com.google.protobuf.CodedOutputStream
            .computeInt32Size(4, stringSystem_);
        }
        if (((bitField0_ & 0x00000010) == 0x00000010)) {
          size += com.google.protobuf.CodedOutputStream
            .computeBoolSize(5, zNull_);
        }
        size += getUnknownFields().getSerializedSize();
        memoizedSerializedSize = size;
        return size;
      }

      private static final long serialVersionUID = 0L;
      @java.lang.Override
      protected java.lang.Object writeReplace()
          throws java.io.ObjectStreamException {
        return super.writeReplace();
      }

      public static ThingModel.Proto.General.Property.Location parseFrom(
          com.google.protobuf.ByteString data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static ThingModel.Proto.General.Property.Location parseFrom(
          com.google.protobuf.ByteString data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static ThingModel.Proto.General.Property.Location parseFrom(byte[] data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static ThingModel.Proto.General.Property.Location parseFrom(
          byte[] data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static ThingModel.Proto.General.Property.Location parseFrom(java.io.InputStream input)
          throws java.io.IOException {
        return PARSER.parseFrom(input);
      }
      public static ThingModel.Proto.General.Property.Location parseFrom(
          java.io.InputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        return PARSER.parseFrom(input, extensionRegistry);
      }
      public static ThingModel.Proto.General.Property.Location parseDelimitedFrom(java.io.InputStream input)
          throws java.io.IOException {
        return PARSER.parseDelimitedFrom(input);
      }
      public static ThingModel.Proto.General.Property.Location parseDelimitedFrom(
          java.io.InputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        return PARSER.parseDelimitedFrom(input, extensionRegistry);
      }
      public static ThingModel.Proto.General.Property.Location parseFrom(
          com.google.protobuf.CodedInputStream input)
          throws java.io.IOException {
        return PARSER.parseFrom(input);
      }
      public static ThingModel.Proto.General.Property.Location parseFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        return PARSER.parseFrom(input, extensionRegistry);
      }

      public static Builder newBuilder() { return Builder.create(); }
      public Builder newBuilderForType() { return newBuilder(); }
      public static Builder newBuilder(ThingModel.Proto.General.Property.Location prototype) {
        return newBuilder().mergeFrom(prototype);
      }
      public Builder toBuilder() { return newBuilder(this); }

      @java.lang.Override
      protected Builder newBuilderForType(
          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
        Builder builder = new Builder(parent);
        return builder;
      }
      /**
       * Protobuf type {@code ThingModel.Proto.Property.Location}
       */
      public static final class Builder extends
          com.google.protobuf.GeneratedMessage.Builder<Builder>
         implements ThingModel.Proto.General.Property.LocationOrBuilder {
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return ThingModel.Proto.General.internal_static_ThingModel_Proto_Property_Location_descriptor;
        }

        protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return ThingModel.Proto.General.internal_static_ThingModel_Proto_Property_Location_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  ThingModel.Proto.General.Property.Location.class, ThingModel.Proto.General.Property.Location.Builder.class);
        }

        // Construct using ThingModel.Proto.General.Property.Location.newBuilder()
        private Builder() {
          maybeForceBuilderInitialization();
        }

        private Builder(
            com.google.protobuf.GeneratedMessage.BuilderParent parent) {
          super(parent);
          maybeForceBuilderInitialization();
        }
        private void maybeForceBuilderInitialization() {
          if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
          }
        }
        private static Builder create() {
          return new Builder();
        }

        public Builder clear() {
          super.clear();
          x_ = 0D;
          bitField0_ = (bitField0_ & ~0x00000001);
          y_ = 0D;
          bitField0_ = (bitField0_ & ~0x00000002);
          z_ = 0D;
          bitField0_ = (bitField0_ & ~0x00000004);
          stringSystem_ = 0;
          bitField0_ = (bitField0_ & ~0x00000008);
          zNull_ = false;
          bitField0_ = (bitField0_ & ~0x00000010);
          return this;
        }

        public Builder clone() {
          return create().mergeFrom(buildPartial());
        }

        public com.google.protobuf.Descriptors.Descriptor
            getDescriptorForType() {
          return ThingModel.Proto.General.internal_static_ThingModel_Proto_Property_Location_descriptor;
        }

        public ThingModel.Proto.General.Property.Location getDefaultInstanceForType() {
          return ThingModel.Proto.General.Property.Location.getDefaultInstance();
        }

        public ThingModel.Proto.General.Property.Location build() {
          ThingModel.Proto.General.Property.Location result = buildPartial();
          if (!result.isInitialized()) {
            throw newUninitializedMessageException(result);
          }
          return result;
        }

        public ThingModel.Proto.General.Property.Location buildPartial() {
          ThingModel.Proto.General.Property.Location result = new ThingModel.Proto.General.Property.Location(this);
          int from_bitField0_ = bitField0_;
          int to_bitField0_ = 0;
          if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
            to_bitField0_ |= 0x00000001;
          }
          result.x_ = x_;
          if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
            to_bitField0_ |= 0x00000002;
          }
          result.y_ = y_;
          if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
            to_bitField0_ |= 0x00000004;
          }
          result.z_ = z_;
          if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
            to_bitField0_ |= 0x00000008;
          }
          result.stringSystem_ = stringSystem_;
          if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
            to_bitField0_ |= 0x00000010;
          }
          result.zNull_ = zNull_;
          result.bitField0_ = to_bitField0_;
          onBuilt();
          return result;
        }

        public Builder mergeFrom(com.google.protobuf.Message other) {
          if (other instanceof ThingModel.Proto.General.Property.Location) {
            return mergeFrom((ThingModel.Proto.General.Property.Location)other);
          } else {
            super.mergeFrom(other);
            return this;
          }
        }

        public Builder mergeFrom(ThingModel.Proto.General.Property.Location other) {
          if (other == ThingModel.Proto.General.Property.Location.getDefaultInstance()) return this;
          if (other.hasX()) {
            setX(other.getX());
          }
          if (other.hasY()) {
            setY(other.getY());
          }
          if (other.hasZ()) {
            setZ(other.getZ());
          }
          if (other.hasStringSystem()) {
            setStringSystem(other.getStringSystem());
          }
          if (other.hasZNull()) {
            setZNull(other.getZNull());
          }
          this.mergeUnknownFields(other.getUnknownFields());
          return this;
        }

        public final boolean isInitialized() {
          if (!hasX()) {
            
            return false;
          }
          if (!hasY()) {
            
            return false;
          }
          return true;
        }

        public Builder mergeFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          ThingModel.Proto.General.Property.Location parsedMessage = null;
          try {
            parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            parsedMessage = (ThingModel.Proto.General.Property.Location) e.getUnfinishedMessage();
            throw e;
          } finally {
            if (parsedMessage != null) {
              mergeFrom(parsedMessage);
            }
          }
          return this;
        }
        private int bitField0_;

        // required double x = 1 [default = 0];
        private double x_ ;
        /**
         * <code>required double x = 1 [default = 0];</code>
         */
        public boolean hasX() {
          return ((bitField0_ & 0x00000001) == 0x00000001);
        }
        /**
         * <code>required double x = 1 [default = 0];</code>
         */
        public double getX() {
          return x_;
        }
        /**
         * <code>required double x = 1 [default = 0];</code>
         */
        public Builder setX(double value) {
          bitField0_ |= 0x00000001;
          x_ = value;
          onChanged();
          return this;
        }
        /**
         * <code>required double x = 1 [default = 0];</code>
         */
        public Builder clearX() {
          bitField0_ = (bitField0_ & ~0x00000001);
          x_ = 0D;
          onChanged();
          return this;
        }

        // required double y = 2 [default = 0];
        private double y_ ;
        /**
         * <code>required double y = 2 [default = 0];</code>
         */
        public boolean hasY() {
          return ((bitField0_ & 0x00000002) == 0x00000002);
        }
        /**
         * <code>required double y = 2 [default = 0];</code>
         */
        public double getY() {
          return y_;
        }
        /**
         * <code>required double y = 2 [default = 0];</code>
         */
        public Builder setY(double value) {
          bitField0_ |= 0x00000002;
          y_ = value;
          onChanged();
          return this;
        }
        /**
         * <code>required double y = 2 [default = 0];</code>
         */
        public Builder clearY() {
          bitField0_ = (bitField0_ & ~0x00000002);
          y_ = 0D;
          onChanged();
          return this;
        }

        // optional double z = 3 [default = 0];
        private double z_ ;
        /**
         * <code>optional double z = 3 [default = 0];</code>
         */
        public boolean hasZ() {
          return ((bitField0_ & 0x00000004) == 0x00000004);
        }
        /**
         * <code>optional double z = 3 [default = 0];</code>
         */
        public double getZ() {
          return z_;
        }
        /**
         * <code>optional double z = 3 [default = 0];</code>
         */
        public Builder setZ(double value) {
          bitField0_ |= 0x00000004;
          z_ = value;
          onChanged();
          return this;
        }
        /**
         * <code>optional double z = 3 [default = 0];</code>
         */
        public Builder clearZ() {
          bitField0_ = (bitField0_ & ~0x00000004);
          z_ = 0D;
          onChanged();
          return this;
        }

        // optional int32 string_system = 4;
        private int stringSystem_ ;
        /**
         * <code>optional int32 string_system = 4;</code>
         *
         * <pre>
         * WGS84 by default
         * </pre>
         */
        public boolean hasStringSystem() {
          return ((bitField0_ & 0x00000008) == 0x00000008);
        }
        /**
         * <code>optional int32 string_system = 4;</code>
         *
         * <pre>
         * WGS84 by default
         * </pre>
         */
        public int getStringSystem() {
          return stringSystem_;
        }
        /**
         * <code>optional int32 string_system = 4;</code>
         *
         * <pre>
         * WGS84 by default
         * </pre>
         */
        public Builder setStringSystem(int value) {
          bitField0_ |= 0x00000008;
          stringSystem_ = value;
          onChanged();
          return this;
        }
        /**
         * <code>optional int32 string_system = 4;</code>
         *
         * <pre>
         * WGS84 by default
         * </pre>
         */
        public Builder clearStringSystem() {
          bitField0_ = (bitField0_ & ~0x00000008);
          stringSystem_ = 0;
          onChanged();
          return this;
        }

        // optional bool z_null = 5 [default = false];
        private boolean zNull_ ;
        /**
         * <code>optional bool z_null = 5 [default = false];</code>
         *
         * <pre>
         * When the z attribute is not present
         * </pre>
         */
        public boolean hasZNull() {
          return ((bitField0_ & 0x00000010) == 0x00000010);
        }
        /**
         * <code>optional bool z_null = 5 [default = false];</code>
         *
         * <pre>
         * When the z attribute is not present
         * </pre>
         */
        public boolean getZNull() {
          return zNull_;
        }
        /**
         * <code>optional bool z_null = 5 [default = false];</code>
         *
         * <pre>
         * When the z attribute is not present
         * </pre>
         */
        public Builder setZNull(boolean value) {
          bitField0_ |= 0x00000010;
          zNull_ = value;
          onChanged();
          return this;
        }
        /**
         * <code>optional bool z_null = 5 [default = false];</code>
         *
         * <pre>
         * When the z attribute is not present
         * </pre>
         */
        public Builder clearZNull() {
          bitField0_ = (bitField0_ & ~0x00000010);
          zNull_ = false;
          onChanged();
          return this;
        }

        // @@protoc_insertion_point(builder_scope:ThingModel.Proto.Property.Location)
      }

      static {
        defaultInstance = new Location(true);
        defaultInstance.initFields();
      }

      // @@protoc_insertion_point(class_scope:ThingModel.Proto.Property.Location)
    }

    public interface StringOrBuilder
        extends com.google.protobuf.MessageOrBuilder {

      // optional string value = 1;
      /**
       * <code>optional string value = 1;</code>
       */
      boolean hasValue();
      /**
       * <code>optional string value = 1;</code>
       */
      java.lang.String getValue();
      /**
       * <code>optional string value = 1;</code>
       */
      com.google.protobuf.ByteString
          getValueBytes();

      // optional int32 string_value = 2 [default = 0];
      /**
       * <code>optional int32 string_value = 2 [default = 0];</code>
       *
       * <pre>
       **
       *	A string can be cached using StringDeclaration
       *	It's just an option, and a developer
       *	is allowed to ignore this feature
       *	when he want to send a string property.
       * </pre>
       */
      boolean hasStringValue();
      /**
       * <code>optional int32 string_value = 2 [default = 0];</code>
       *
       * <pre>
       **
       *	A string can be cached using StringDeclaration
       *	It's just an option, and a developer
       *	is allowed to ignore this feature
       *	when he want to send a string property.
       * </pre>
       */
      int getStringValue();
    }
    /**
     * Protobuf type {@code ThingModel.Proto.Property.String}
     */
    public static final class String extends
        com.google.protobuf.GeneratedMessage
        implements StringOrBuilder {
      // Use String.newBuilder() to construct.
      private String(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
        super(builder);
        this.unknownFields = builder.getUnknownFields();
      }
      private String(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

      private static final String defaultInstance;
      public static String getDefaultInstance() {
        return defaultInstance;
      }

      public String getDefaultInstanceForType() {
        return defaultInstance;
      }

      private final com.google.protobuf.UnknownFieldSet unknownFields;
      @java.lang.Override
      public final com.google.protobuf.UnknownFieldSet
          getUnknownFields() {
        return this.unknownFields;
      }
      private String(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        initFields();
        int mutable_bitField0_ = 0;
        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
            com.google.protobuf.UnknownFieldSet.newBuilder();
        try {
          boolean done = false;
          while (!done) {
            int tag = input.readTag();
            switch (tag) {
              case 0:
                done = true;
                break;
              default: {
                if (!parseUnknownField(input, unknownFields,
                                       extensionRegistry, tag)) {
                  done = true;
                }
                break;
              }
              case 10: {
                bitField0_ |= 0x00000001;
                value_ = input.readBytes();
                break;
              }
              case 16: {
                bitField0_ |= 0x00000002;
                stringValue_ = input.readInt32();
                break;
              }
            }
          }
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          throw e.setUnfinishedMessage(this);
        } catch (java.io.IOException e) {
          throw new com.google.protobuf.InvalidProtocolBufferException(
              e.getMessage()).setUnfinishedMessage(this);
        } finally {
          this.unknownFields = unknownFields.build();
          makeExtensionsImmutable();
        }
      }
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return ThingModel.Proto.General.internal_static_ThingModel_Proto_Property_String_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return ThingModel.Proto.General.internal_static_ThingModel_Proto_Property_String_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                ThingModel.Proto.General.Property.String.class, ThingModel.Proto.General.Property.String.Builder.class);
      }

      public static com.google.protobuf.Parser<String> PARSER =
          new com.google.protobuf.AbstractParser<String>() {
        public String parsePartialFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return new String(input, extensionRegistry);
        }
      };

      @java.lang.Override
      public com.google.protobuf.Parser<String> getParserForType() {
        return PARSER;
      }

      private int bitField0_;
      // optional string value = 1;
      public static final int VALUE_FIELD_NUMBER = 1;
      private java.lang.Object value_;
      /**
       * <code>optional string value = 1;</code>
       */
      public boolean hasValue() {
        return ((bitField0_ & 0x00000001) == 0x00000001);
      }
      /**
       * <code>optional string value = 1;</code>
       */
      public java.lang.String getValue() {
        java.lang.Object ref = value_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            value_ = s;
          }
          return s;
        }
      }
      /**
       * <code>optional string value = 1;</code>
       */
      public com.google.protobuf.ByteString
          getValueBytes() {
        java.lang.Object ref = value_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          value_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      // optional int32 string_value = 2 [default = 0];
      public static final int STRING_VALUE_FIELD_NUMBER = 2;
      private int stringValue_;
      /**
       * <code>optional int32 string_value = 2 [default = 0];</code>
       *
       * <pre>
       **
       *	A string can be cached using StringDeclaration
       *	It's just an option, and a developer
       *	is allowed to ignore this feature
       *	when he want to send a string property.
       * </pre>
       */
      public boolean hasStringValue() {
        return ((bitField0_ & 0x00000002) == 0x00000002);
      }
      /**
       * <code>optional int32 string_value = 2 [default = 0];</code>
       *
       * <pre>
       **
       *	A string can be cached using StringDeclaration
       *	It's just an option, and a developer
       *	is allowed to ignore this feature
       *	when he want to send a string property.
       * </pre>
       */
      public int getStringValue() {
        return stringValue_;
      }

      private void initFields() {
        value_ = "";
        stringValue_ = 0;
      }
      private byte memoizedIsInitialized = -1;
      public final boolean isInitialized() {
        byte isInitialized = memoizedIsInitialized;
        if (isInitialized != -1) return isInitialized == 1;

        memoizedIsInitialized = 1;
        return true;
      }

      public void writeTo(com.google.protobuf.CodedOutputStream output)
                          throws java.io.IOException {
        getSerializedSize();
        if (((bitField0_ & 0x00000001) == 0x00000001)) {
          output.writeBytes(1, getValueBytes());
        }
        if (((bitField0_ & 0x00000002) == 0x00000002)) {
          output.writeInt32(2, stringValue_);
        }
        getUnknownFields().writeTo(output);
      }

      private int memoizedSerializedSize = -1;
      public int getSerializedSize() {
        int size = memoizedSerializedSize;
        if (size != -1) return size;

        size = 0;
        if (((bitField0_ & 0x00000001) == 0x00000001)) {
          size += com.google.protobuf.CodedOutputStream
            .computeBytesSize(1, getValueBytes());
        }
        if (((bitField0_ & 0x00000002) == 0x00000002)) {
          size += com.google.protobuf.CodedOutputStream
            .computeInt32Size(2, stringValue_);
        }
        size += getUnknownFields().getSerializedSize();
        memoizedSerializedSize = size;
        return size;
      }

      private static final long serialVersionUID = 0L;
      @java.lang.Override
      protected java.lang.Object writeReplace()
          throws java.io.ObjectStreamException {
        return super.writeReplace();
      }

      public static ThingModel.Proto.General.Property.String parseFrom(
          com.google.protobuf.ByteString data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static ThingModel.Proto.General.Property.String parseFrom(
          com.google.protobuf.ByteString data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static ThingModel.Proto.General.Property.String parseFrom(byte[] data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static ThingModel.Proto.General.Property.String parseFrom(
          byte[] data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static ThingModel.Proto.General.Property.String parseFrom(java.io.InputStream input)
          throws java.io.IOException {
        return PARSER.parseFrom(input);
      }
      public static ThingModel.Proto.General.Property.String parseFrom(
          java.io.InputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        return PARSER.parseFrom(input, extensionRegistry);
      }
      public static ThingModel.Proto.General.Property.String parseDelimitedFrom(java.io.InputStream input)
          throws java.io.IOException {
        return PARSER.parseDelimitedFrom(input);
      }
      public static ThingModel.Proto.General.Property.String parseDelimitedFrom(
          java.io.InputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        return PARSER.parseDelimitedFrom(input, extensionRegistry);
      }
      public static ThingModel.Proto.General.Property.String parseFrom(
          com.google.protobuf.CodedInputStream input)
          throws java.io.IOException {
        return PARSER.parseFrom(input);
      }
      public static ThingModel.Proto.General.Property.String parseFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        return PARSER.parseFrom(input, extensionRegistry);
      }

      public static Builder newBuilder() { return Builder.create(); }
      public Builder newBuilderForType() { return newBuilder(); }
      public static Builder newBuilder(ThingModel.Proto.General.Property.String prototype) {
        return newBuilder().mergeFrom(prototype);
      }
      public Builder toBuilder() { return newBuilder(this); }

      @java.lang.Override
      protected Builder newBuilderForType(
          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
        Builder builder = new Builder(parent);
        return builder;
      }
      /**
       * Protobuf type {@code ThingModel.Proto.Property.String}
       */
      public static final class Builder extends
          com.google.protobuf.GeneratedMessage.Builder<Builder>
         implements ThingModel.Proto.General.Property.StringOrBuilder {
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return ThingModel.Proto.General.internal_static_ThingModel_Proto_Property_String_descriptor;
        }

        protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return ThingModel.Proto.General.internal_static_ThingModel_Proto_Property_String_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  ThingModel.Proto.General.Property.String.class, ThingModel.Proto.General.Property.String.Builder.class);
        }

        // Construct using ThingModel.Proto.General.Property.String.newBuilder()
        private Builder() {
          maybeForceBuilderInitialization();
        }

        private Builder(
            com.google.protobuf.GeneratedMessage.BuilderParent parent) {
          super(parent);
          maybeForceBuilderInitialization();
        }
        private void maybeForceBuilderInitialization() {
          if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
          }
        }
        private static Builder create() {
          return new Builder();
        }

        public Builder clear() {
          super.clear();
          value_ = "";
          bitField0_ = (bitField0_ & ~0x00000001);
          stringValue_ = 0;
          bitField0_ = (bitField0_ & ~0x00000002);
          return this;
        }

        public Builder clone() {
          return create().mergeFrom(buildPartial());
        }

        public com.google.protobuf.Descriptors.Descriptor
            getDescriptorForType() {
          return ThingModel.Proto.General.internal_static_ThingModel_Proto_Property_String_descriptor;
        }

        public ThingModel.Proto.General.Property.String getDefaultInstanceForType() {
          return ThingModel.Proto.General.Property.String.getDefaultInstance();
        }

        public ThingModel.Proto.General.Property.String build() {
          ThingModel.Proto.General.Property.String result = buildPartial();
          if (!result.isInitialized()) {
            throw newUninitializedMessageException(result);
          }
          return result;
        }

        public ThingModel.Proto.General.Property.String buildPartial() {
          ThingModel.Proto.General.Property.String result = new ThingModel.Proto.General.Property.String(this);
          int from_bitField0_ = bitField0_;
          int to_bitField0_ = 0;
          if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
            to_bitField0_ |= 0x00000001;
          }
          result.value_ = value_;
          if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
            to_bitField0_ |= 0x00000002;
          }
          result.stringValue_ = stringValue_;
          result.bitField0_ = to_bitField0_;
          onBuilt();
          return result;
        }

        public Builder mergeFrom(com.google.protobuf.Message other) {
          if (other instanceof ThingModel.Proto.General.Property.String) {
            return mergeFrom((ThingModel.Proto.General.Property.String)other);
          } else {
            super.mergeFrom(other);
            return this;
          }
        }

        public Builder mergeFrom(ThingModel.Proto.General.Property.String other) {
          if (other == ThingModel.Proto.General.Property.String.getDefaultInstance()) return this;
          if (other.hasValue()) {
            bitField0_ |= 0x00000001;
            value_ = other.value_;
            onChanged();
          }
          if (other.hasStringValue()) {
            setStringValue(other.getStringValue());
          }
          this.mergeUnknownFields(other.getUnknownFields());
          return this;
        }

        public final boolean isInitialized() {
          return true;
        }

        public Builder mergeFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          ThingModel.Proto.General.Property.String parsedMessage = null;
          try {
            parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            parsedMessage = (ThingModel.Proto.General.Property.String) e.getUnfinishedMessage();
            throw e;
          } finally {
            if (parsedMessage != null) {
              mergeFrom(parsedMessage);
            }
          }
          return this;
        }
        private int bitField0_;

        // optional string value = 1;
        private java.lang.Object value_ = "";
        /**
         * <code>optional string value = 1;</code>
         */
        public boolean hasValue() {
          return ((bitField0_ & 0x00000001) == 0x00000001);
        }
        /**
         * <code>optional string value = 1;</code>
         */
        public java.lang.String getValue() {
          java.lang.Object ref = value_;
          if (!(ref instanceof java.lang.String)) {
            java.lang.String s = ((com.google.protobuf.ByteString) ref)
                .toStringUtf8();
            value_ = s;
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <code>optional string value = 1;</code>
         */
        public com.google.protobuf.ByteString
            getValueBytes() {
          java.lang.Object ref = value_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            value_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <code>optional string value = 1;</code>
         */
        public Builder setValue(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
          value_ = value;
          onChanged();
          return this;
        }
        /**
         * <code>optional string value = 1;</code>
         */
        public Builder clearValue() {
          bitField0_ = (bitField0_ & ~0x00000001);
          value_ = getDefaultInstance().getValue();
          onChanged();
          return this;
        }
        /**
         * <code>optional string value = 1;</code>
         */
        public Builder setValueBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
          value_ = value;
          onChanged();
          return this;
        }

        // optional int32 string_value = 2 [default = 0];
        private int stringValue_ ;
        /**
         * <code>optional int32 string_value = 2 [default = 0];</code>
         *
         * <pre>
         **
         *	A string can be cached using StringDeclaration
         *	It's just an option, and a developer
         *	is allowed to ignore this feature
         *	when he want to send a string property.
         * </pre>
         */
        public boolean hasStringValue() {
          return ((bitField0_ & 0x00000002) == 0x00000002);
        }
        /**
         * <code>optional int32 string_value = 2 [default = 0];</code>
         *
         * <pre>
         **
         *	A string can be cached using StringDeclaration
         *	It's just an option, and a developer
         *	is allowed to ignore this feature
         *	when he want to send a string property.
         * </pre>
         */
        public int getStringValue() {
          return stringValue_;
        }
        /**
         * <code>optional int32 string_value = 2 [default = 0];</code>
         *
         * <pre>
         **
         *	A string can be cached using StringDeclaration
         *	It's just an option, and a developer
         *	is allowed to ignore this feature
         *	when he want to send a string property.
         * </pre>
         */
        public Builder setStringValue(int value) {
          bitField0_ |= 0x00000002;
          stringValue_ = value;
          onChanged();
          return this;
        }
        /**
         * <code>optional int32 string_value = 2 [default = 0];</code>
         *
         * <pre>
         **
         *	A string can be cached using StringDeclaration
         *	It's just an option, and a developer
         *	is allowed to ignore this feature
         *	when he want to send a string property.
         * </pre>
         */
        public Builder clearStringValue() {
          bitField0_ = (bitField0_ & ~0x00000002);
          stringValue_ = 0;
          onChanged();
          return this;
        }

        // @@protoc_insertion_point(builder_scope:ThingModel.Proto.Property.String)
      }

      static {
        defaultInstance = new String(true);
        defaultInstance.initFields();
      }

      // @@protoc_insertion_point(class_scope:ThingModel.Proto.Property.String)
    }

    private int bitField0_;
    // required int32 string_key = 1;
    public static final int STRING_KEY_FIELD_NUMBER = 1;
    private int stringKey_;
    /**
     * <code>required int32 string_key = 1;</code>
     */
    public boolean hasStringKey() {
      return ((bitField0_ & 0x00000001) == 0x00000001);
    }
    /**
     * <code>required int32 string_key = 1;</code>
     */
    public int getStringKey() {
      return stringKey_;
    }

    // required .ThingModel.Proto.Property.Type type = 2 [default = STRING];
    public static final int TYPE_FIELD_NUMBER = 2;
    private ThingModel.Proto.General.Property.Type type_;
    /**
     * <code>required .ThingModel.Proto.Property.Type type = 2 [default = STRING];</code>
     */
    public boolean hasType() {
      return ((bitField0_ & 0x00000002) == 0x00000002);
    }
    /**
     * <code>required .ThingModel.Proto.Property.Type type = 2 [default = STRING];</code>
     */
    public ThingModel.Proto.General.Property.Type getType() {
      return type_;
    }

    // optional .ThingModel.Proto.Property.Location location_value = 3;
    public static final int LOCATION_VALUE_FIELD_NUMBER = 3;
    private ThingModel.Proto.General.Property.Location locationValue_;
    /**
     * <code>optional .ThingModel.Proto.Property.Location location_value = 3;</code>
     */
    public boolean hasLocationValue() {
      return ((bitField0_ & 0x00000004) == 0x00000004);
    }
    /**
     * <code>optional .ThingModel.Proto.Property.Location location_value = 3;</code>
     */
    public ThingModel.Proto.General.Property.Location getLocationValue() {
      return locationValue_;
    }
    /**
     * <code>optional .ThingModel.Proto.Property.Location location_value = 3;</code>
     */
    public ThingModel.Proto.General.Property.LocationOrBuilder getLocationValueOrBuilder() {
      return locationValue_;
    }

    // optional .ThingModel.Proto.Property.String string_value = 4;
    public static final int STRING_VALUE_FIELD_NUMBER = 4;
    private ThingModel.Proto.General.Property.String stringValue_;
    /**
     * <code>optional .ThingModel.Proto.Property.String string_value = 4;</code>
     */
    public boolean hasStringValue() {
      return ((bitField0_ & 0x00000008) == 0x00000008);
    }
    /**
     * <code>optional .ThingModel.Proto.Property.String string_value = 4;</code>
     */
    public ThingModel.Proto.General.Property.String getStringValue() {
      return stringValue_;
    }
    /**
     * <code>optional .ThingModel.Proto.Property.String string_value = 4;</code>
     */
    public ThingModel.Proto.General.Property.StringOrBuilder getStringValueOrBuilder() {
      return stringValue_;
    }

    // optional double double_value = 5;
    public static final int DOUBLE_VALUE_FIELD_NUMBER = 5;
    private double doubleValue_;
    /**
     * <code>optional double double_value = 5;</code>
     */
    public boolean hasDoubleValue() {
      return ((bitField0_ & 0x00000010) == 0x00000010);
    }
    /**
     * <code>optional double double_value = 5;</code>
     */
    public double getDoubleValue() {
      return doubleValue_;
    }

    // optional int32 int_value = 6;
    public static final int INT_VALUE_FIELD_NUMBER = 6;
    private int intValue_;
    /**
     * <code>optional int32 int_value = 6;</code>
     */
    public boolean hasIntValue() {
      return ((bitField0_ & 0x00000020) == 0x00000020);
    }
    /**
     * <code>optional int32 int_value = 6;</code>
     */
    public int getIntValue() {
      return intValue_;
    }

    // optional bool boolean_value = 7;
    public static final int BOOLEAN_VALUE_FIELD_NUMBER = 7;
    private boolean booleanValue_;
    /**
     * <code>optional bool boolean_value = 7;</code>
     */
    public boolean hasBooleanValue() {
      return ((bitField0_ & 0x00000040) == 0x00000040);
    }
    /**
     * <code>optional bool boolean_value = 7;</code>
     */
    public boolean getBooleanValue() {
      return booleanValue_;
    }

    // optional int64 datetime_value = 8;
    public static final int DATETIME_VALUE_FIELD_NUMBER = 8;
    private long datetimeValue_;
    /**
     * <code>optional int64 datetime_value = 8;</code>
     */
    public boolean hasDatetimeValue() {
      return ((bitField0_ & 0x00000080) == 0x00000080);
    }
    /**
     * <code>optional int64 datetime_value = 8;</code>
     */
    public long getDatetimeValue() {
      return datetimeValue_;
    }

    private void initFields() {
      stringKey_ = 0;
      type_ = ThingModel.Proto.General.Property.Type.STRING;
      locationValue_ = ThingModel.Proto.General.Property.Location.getDefaultInstance();
      stringValue_ = ThingModel.Proto.General.Property.String.getDefaultInstance();
      doubleValue_ = 0D;
      intValue_ = 0;
      booleanValue_ = false;
      datetimeValue_ = 0L;
    }
    private byte memoizedIsInitialized = -1;
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized != -1) return isInitialized == 1;

      if (!hasStringKey()) {
        memoizedIsInitialized = 0;
        return false;
      }
      if (!hasType()) {
        memoizedIsInitialized = 0;
        return false;
      }
      if (hasLocationValue()) {
        if (!getLocationValue().isInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
      }
      memoizedIsInitialized = 1;
      return true;
    }

    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      getSerializedSize();
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        output.writeInt32(1, stringKey_);
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        output.writeEnum(2, type_.getNumber());
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        output.writeMessage(3, locationValue_);
      }
      if (((bitField0_ & 0x00000008) == 0x00000008)) {
        output.writeMessage(4, stringValue_);
      }
      if (((bitField0_ & 0x00000010) == 0x00000010)) {
        output.writeDouble(5, doubleValue_);
      }
      if (((bitField0_ & 0x00000020) == 0x00000020)) {
        output.writeInt32(6, intValue_);
      }
      if (((bitField0_ & 0x00000040) == 0x00000040)) {
        output.writeBool(7, booleanValue_);
      }
      if (((bitField0_ & 0x00000080) == 0x00000080)) {
        output.writeInt64(8, datetimeValue_);
      }
      getUnknownFields().writeTo(output);
    }

    private int memoizedSerializedSize = -1;
    public int getSerializedSize() {
      int size = memoizedSerializedSize;
      if (size != -1) return size;

      size = 0;
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt32Size(1, stringKey_);
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        size += com.google.protobuf.CodedOutputStream
          .computeEnumSize(2, type_.getNumber());
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(3, locationValue_);
      }
      if (((bitField0_ & 0x00000008) == 0x00000008)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(4, stringValue_);
      }
      if (((bitField0_ & 0x00000010) == 0x00000010)) {
        size += com.google.protobuf.CodedOutputStream
          .computeDoubleSize(5, doubleValue_);
      }
      if (((bitField0_ & 0x00000020) == 0x00000020)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt32Size(6, intValue_);
      }
      if (((bitField0_ & 0x00000040) == 0x00000040)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBoolSize(7, booleanValue_);
      }
      if (((bitField0_ & 0x00000080) == 0x00000080)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt64Size(8, datetimeValue_);
      }
      size += getUnknownFields().getSerializedSize();
      memoizedSerializedSize = size;
      return size;
    }

    private static final long serialVersionUID = 0L;
    @java.lang.Override
    protected java.lang.Object writeReplace()
        throws java.io.ObjectStreamException {
      return super.writeReplace();
    }

    public static ThingModel.Proto.General.Property parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static ThingModel.Proto.General.Property parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static ThingModel.Proto.General.Property parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static ThingModel.Proto.General.Property parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static ThingModel.Proto.General.Property parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static ThingModel.Proto.General.Property parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }
    public static ThingModel.Proto.General.Property parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input);
    }
    public static ThingModel.Proto.General.Property parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input, extensionRegistry);
    }
    public static ThingModel.Proto.General.Property parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static ThingModel.Proto.General.Property parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }

    public static Builder newBuilder() { return Builder.create(); }
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder(ThingModel.Proto.General.Property prototype) {
      return newBuilder().mergeFrom(prototype);
    }
    public Builder toBuilder() { return newBuilder(this); }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code ThingModel.Proto.Property}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessage.Builder<Builder>
       implements ThingModel.Proto.General.PropertyOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return ThingModel.Proto.General.internal_static_ThingModel_Proto_Property_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return ThingModel.Proto.General.internal_static_ThingModel_Proto_Property_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                ThingModel.Proto.General.Property.class, ThingModel.Proto.General.Property.Builder.class);
      }

      // Construct using ThingModel.Proto.General.Property.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
          getLocationValueFieldBuilder();
          getStringValueFieldBuilder();
        }
      }
      private static Builder create() {
        return new Builder();
      }

      public Builder clear() {
        super.clear();
        stringKey_ = 0;
        bitField0_ = (bitField0_ & ~0x00000001);
        type_ = ThingModel.Proto.General.Property.Type.STRING;
        bitField0_ = (bitField0_ & ~0x00000002);
        if (locationValueBuilder_ == null) {
          locationValue_ = ThingModel.Proto.General.Property.Location.getDefaultInstance();
        } else {
          locationValueBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000004);
        if (stringValueBuilder_ == null) {
          stringValue_ = ThingModel.Proto.General.Property.String.getDefaultInstance();
        } else {
          stringValueBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000008);
        doubleValue_ = 0D;
        bitField0_ = (bitField0_ & ~0x00000010);
        intValue_ = 0;
        bitField0_ = (bitField0_ & ~0x00000020);
        booleanValue_ = false;
        bitField0_ = (bitField0_ & ~0x00000040);
        datetimeValue_ = 0L;
        bitField0_ = (bitField0_ & ~0x00000080);
        return this;
      }

      public Builder clone() {
        return create().mergeFrom(buildPartial());
      }

      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return ThingModel.Proto.General.internal_static_ThingModel_Proto_Property_descriptor;
      }

      public ThingModel.Proto.General.Property getDefaultInstanceForType() {
        return ThingModel.Proto.General.Property.getDefaultInstance();
      }

      public ThingModel.Proto.General.Property build() {
        ThingModel.Proto.General.Property result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      public ThingModel.Proto.General.Property buildPartial() {
        ThingModel.Proto.General.Property result = new ThingModel.Proto.General.Property(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
          to_bitField0_ |= 0x00000001;
        }
        result.stringKey_ = stringKey_;
        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
          to_bitField0_ |= 0x00000002;
        }
        result.type_ = type_;
        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
          to_bitField0_ |= 0x00000004;
        }
        if (locationValueBuilder_ == null) {
          result.locationValue_ = locationValue_;
        } else {
          result.locationValue_ = locationValueBuilder_.build();
        }
        if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
          to_bitField0_ |= 0x00000008;
        }
        if (stringValueBuilder_ == null) {
          result.stringValue_ = stringValue_;
        } else {
          result.stringValue_ = stringValueBuilder_.build();
        }
        if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
          to_bitField0_ |= 0x00000010;
        }
        result.doubleValue_ = doubleValue_;
        if (((from_bitField0_ & 0x00000020) == 0x00000020)) {
          to_bitField0_ |= 0x00000020;
        }
        result.intValue_ = intValue_;
        if (((from_bitField0_ & 0x00000040) == 0x00000040)) {
          to_bitField0_ |= 0x00000040;
        }
        result.booleanValue_ = booleanValue_;
        if (((from_bitField0_ & 0x00000080) == 0x00000080)) {
          to_bitField0_ |= 0x00000080;
        }
        result.datetimeValue_ = datetimeValue_;
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof ThingModel.Proto.General.Property) {
          return mergeFrom((ThingModel.Proto.General.Property)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(ThingModel.Proto.General.Property other) {
        if (other == ThingModel.Proto.General.Property.getDefaultInstance()) return this;
        if (other.hasStringKey()) {
          setStringKey(other.getStringKey());
        }
        if (other.hasType()) {
          setType(other.getType());
        }
        if (other.hasLocationValue()) {
          mergeLocationValue(other.getLocationValue());
        }
        if (other.hasStringValue()) {
          mergeStringValue(other.getStringValue());
        }
        if (other.hasDoubleValue()) {
          setDoubleValue(other.getDoubleValue());
        }
        if (other.hasIntValue()) {
          setIntValue(other.getIntValue());
        }
        if (other.hasBooleanValue()) {
          setBooleanValue(other.getBooleanValue());
        }
        if (other.hasDatetimeValue()) {
          setDatetimeValue(other.getDatetimeValue());
        }
        this.mergeUnknownFields(other.getUnknownFields());
        return this;
      }

      public final boolean isInitialized() {
        if (!hasStringKey()) {
          
          return false;
        }
        if (!hasType()) {
          
          return false;
        }
        if (hasLocationValue()) {
          if (!getLocationValue().isInitialized()) {
            
            return false;
          }
        }
        return true;
      }

      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        ThingModel.Proto.General.Property parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (ThingModel.Proto.General.Property) e.getUnfinishedMessage();
          throw e;
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      // required int32 string_key = 1;
      private int stringKey_ ;
      /**
       * <code>required int32 string_key = 1;</code>
       */
      public boolean hasStringKey() {
        return ((bitField0_ & 0x00000001) == 0x00000001);
      }
      /**
       * <code>required int32 string_key = 1;</code>
       */
      public int getStringKey() {
        return stringKey_;
      }
      /**
       * <code>required int32 string_key = 1;</code>
       */
      public Builder setStringKey(int value) {
        bitField0_ |= 0x00000001;
        stringKey_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>required int32 string_key = 1;</code>
       */
      public Builder clearStringKey() {
        bitField0_ = (bitField0_ & ~0x00000001);
        stringKey_ = 0;
        onChanged();
        return this;
      }

      // required .ThingModel.Proto.Property.Type type = 2 [default = STRING];
      private ThingModel.Proto.General.Property.Type type_ = ThingModel.Proto.General.Property.Type.STRING;
      /**
       * <code>required .ThingModel.Proto.Property.Type type = 2 [default = STRING];</code>
       */
      public boolean hasType() {
        return ((bitField0_ & 0x00000002) == 0x00000002);
      }
      /**
       * <code>required .ThingModel.Proto.Property.Type type = 2 [default = STRING];</code>
       */
      public ThingModel.Proto.General.Property.Type getType() {
        return type_;
      }
      /**
       * <code>required .ThingModel.Proto.Property.Type type = 2 [default = STRING];</code>
       */
      public Builder setType(ThingModel.Proto.General.Property.Type value) {
        if (value == null) {
          throw new NullPointerException();
        }
        bitField0_ |= 0x00000002;
        type_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>required .ThingModel.Proto.Property.Type type = 2 [default = STRING];</code>
       */
      public Builder clearType() {
        bitField0_ = (bitField0_ & ~0x00000002);
        type_ = ThingModel.Proto.General.Property.Type.STRING;
        onChanged();
        return this;
      }

      // optional .ThingModel.Proto.Property.Location location_value = 3;
      private ThingModel.Proto.General.Property.Location locationValue_ = ThingModel.Proto.General.Property.Location.getDefaultInstance();
      private com.google.protobuf.SingleFieldBuilder<
          ThingModel.Proto.General.Property.Location, ThingModel.Proto.General.Property.Location.Builder, ThingModel.Proto.General.Property.LocationOrBuilder> locationValueBuilder_;
      /**
       * <code>optional .ThingModel.Proto.Property.Location location_value = 3;</code>
       */
      public boolean hasLocationValue() {
        return ((bitField0_ & 0x00000004) == 0x00000004);
      }
      /**
       * <code>optional .ThingModel.Proto.Property.Location location_value = 3;</code>
       */
      public ThingModel.Proto.General.Property.Location getLocationValue() {
        if (locationValueBuilder_ == null) {
          return locationValue_;
        } else {
          return locationValueBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .ThingModel.Proto.Property.Location location_value = 3;</code>
       */
      public Builder setLocationValue(ThingModel.Proto.General.Property.Location value) {
        if (locationValueBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          locationValue_ = value;
          onChanged();
        } else {
          locationValueBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000004;
        return this;
      }
      /**
       * <code>optional .ThingModel.Proto.Property.Location location_value = 3;</code>
       */
      public Builder setLocationValue(
          ThingModel.Proto.General.Property.Location.Builder builderForValue) {
        if (locationValueBuilder_ == null) {
          locationValue_ = builderForValue.build();
          onChanged();
        } else {
          locationValueBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000004;
        return this;
      }
      /**
       * <code>optional .ThingModel.Proto.Property.Location location_value = 3;</code>
       */
      public Builder mergeLocationValue(ThingModel.Proto.General.Property.Location value) {
        if (locationValueBuilder_ == null) {
          if (((bitField0_ & 0x00000004) == 0x00000004) &&
              locationValue_ != ThingModel.Proto.General.Property.Location.getDefaultInstance()) {
            locationValue_ =
              ThingModel.Proto.General.Property.Location.newBuilder(locationValue_).mergeFrom(value).buildPartial();
          } else {
            locationValue_ = value;
          }
          onChanged();
        } else {
          locationValueBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000004;
        return this;
      }
      /**
       * <code>optional .ThingModel.Proto.Property.Location location_value = 3;</code>
       */
      public Builder clearLocationValue() {
        if (locationValueBuilder_ == null) {
          locationValue_ = ThingModel.Proto.General.Property.Location.getDefaultInstance();
          onChanged();
        } else {
          locationValueBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000004);
        return this;
      }
      /**
       * <code>optional .ThingModel.Proto.Property.Location location_value = 3;</code>
       */
      public ThingModel.Proto.General.Property.Location.Builder getLocationValueBuilder() {
        bitField0_ |= 0x00000004;
        onChanged();
        return getLocationValueFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .ThingModel.Proto.Property.Location location_value = 3;</code>
       */
      public ThingModel.Proto.General.Property.LocationOrBuilder getLocationValueOrBuilder() {
        if (locationValueBuilder_ != null) {
          return locationValueBuilder_.getMessageOrBuilder();
        } else {
          return locationValue_;
        }
      }
      /**
       * <code>optional .ThingModel.Proto.Property.Location location_value = 3;</code>
       */
      private com.google.protobuf.SingleFieldBuilder<
          ThingModel.Proto.General.Property.Location, ThingModel.Proto.General.Property.Location.Builder, ThingModel.Proto.General.Property.LocationOrBuilder> 
          getLocationValueFieldBuilder() {
        if (locationValueBuilder_ == null) {
          locationValueBuilder_ = new com.google.protobuf.SingleFieldBuilder<
              ThingModel.Proto.General.Property.Location, ThingModel.Proto.General.Property.Location.Builder, ThingModel.Proto.General.Property.LocationOrBuilder>(
                  locationValue_,
                  getParentForChildren(),
                  isClean());
          locationValue_ = null;
        }
        return locationValueBuilder_;
      }

      // optional .ThingModel.Proto.Property.String string_value = 4;
      private ThingModel.Proto.General.Property.String stringValue_ = ThingModel.Proto.General.Property.String.getDefaultInstance();
      private com.google.protobuf.SingleFieldBuilder<
          ThingModel.Proto.General.Property.String, ThingModel.Proto.General.Property.String.Builder, ThingModel.Proto.General.Property.StringOrBuilder> stringValueBuilder_;
      /**
       * <code>optional .ThingModel.Proto.Property.String string_value = 4;</code>
       */
      public boolean hasStringValue() {
        return ((bitField0_ & 0x00000008) == 0x00000008);
      }
      /**
       * <code>optional .ThingModel.Proto.Property.String string_value = 4;</code>
       */
      public ThingModel.Proto.General.Property.String getStringValue() {
        if (stringValueBuilder_ == null) {
          return stringValue_;
        } else {
          return stringValueBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .ThingModel.Proto.Property.String string_value = 4;</code>
       */
      public Builder setStringValue(ThingModel.Proto.General.Property.String value) {
        if (stringValueBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          stringValue_ = value;
          onChanged();
        } else {
          stringValueBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000008;
        return this;
      }
      /**
       * <code>optional .ThingModel.Proto.Property.String string_value = 4;</code>
       */
      public Builder setStringValue(
          ThingModel.Proto.General.Property.String.Builder builderForValue) {
        if (stringValueBuilder_ == null) {
          stringValue_ = builderForValue.build();
          onChanged();
        } else {
          stringValueBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000008;
        return this;
      }
      /**
       * <code>optional .ThingModel.Proto.Property.String string_value = 4;</code>
       */
      public Builder mergeStringValue(ThingModel.Proto.General.Property.String value) {
        if (stringValueBuilder_ == null) {
          if (((bitField0_ & 0x00000008) == 0x00000008) &&
              stringValue_ != ThingModel.Proto.General.Property.String.getDefaultInstance()) {
            stringValue_ =
              ThingModel.Proto.General.Property.String.newBuilder(stringValue_).mergeFrom(value).buildPartial();
          } else {
            stringValue_ = value;
          }
          onChanged();
        } else {
          stringValueBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000008;
        return this;
      }
      /**
       * <code>optional .ThingModel.Proto.Property.String string_value = 4;</code>
       */
      public Builder clearStringValue() {
        if (stringValueBuilder_ == null) {
          stringValue_ = ThingModel.Proto.General.Property.String.getDefaultInstance();
          onChanged();
        } else {
          stringValueBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000008);
        return this;
      }
      /**
       * <code>optional .ThingModel.Proto.Property.String string_value = 4;</code>
       */
      public ThingModel.Proto.General.Property.String.Builder getStringValueBuilder() {
        bitField0_ |= 0x00000008;
        onChanged();
        return getStringValueFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .ThingModel.Proto.Property.String string_value = 4;</code>
       */
      public ThingModel.Proto.General.Property.StringOrBuilder getStringValueOrBuilder() {
        if (stringValueBuilder_ != null) {
          return stringValueBuilder_.getMessageOrBuilder();
        } else {
          return stringValue_;
        }
      }
      /**
       * <code>optional .ThingModel.Proto.Property.String string_value = 4;</code>
       */
      private com.google.protobuf.SingleFieldBuilder<
          ThingModel.Proto.General.Property.String, ThingModel.Proto.General.Property.String.Builder, ThingModel.Proto.General.Property.StringOrBuilder> 
          getStringValueFieldBuilder() {
        if (stringValueBuilder_ == null) {
          stringValueBuilder_ = new com.google.protobuf.SingleFieldBuilder<
              ThingModel.Proto.General.Property.String, ThingModel.Proto.General.Property.String.Builder, ThingModel.Proto.General.Property.StringOrBuilder>(
                  stringValue_,
                  getParentForChildren(),
                  isClean());
          stringValue_ = null;
        }
        return stringValueBuilder_;
      }

      // optional double double_value = 5;
      private double doubleValue_ ;
      /**
       * <code>optional double double_value = 5;</code>
       */
      public boolean hasDoubleValue() {
        return ((bitField0_ & 0x00000010) == 0x00000010);
      }
      /**
       * <code>optional double double_value = 5;</code>
       */
      public double getDoubleValue() {
        return doubleValue_;
      }
      /**
       * <code>optional double double_value = 5;</code>
       */
      public Builder setDoubleValue(double value) {
        bitField0_ |= 0x00000010;
        doubleValue_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional double double_value = 5;</code>
       */
      public Builder clearDoubleValue() {
        bitField0_ = (bitField0_ & ~0x00000010);
        doubleValue_ = 0D;
        onChanged();
        return this;
      }

      // optional int32 int_value = 6;
      private int intValue_ ;
      /**
       * <code>optional int32 int_value = 6;</code>
       */
      public boolean hasIntValue() {
        return ((bitField0_ & 0x00000020) == 0x00000020);
      }
      /**
       * <code>optional int32 int_value = 6;</code>
       */
      public int getIntValue() {
        return intValue_;
      }
      /**
       * <code>optional int32 int_value = 6;</code>
       */
      public Builder setIntValue(int value) {
        bitField0_ |= 0x00000020;
        intValue_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional int32 int_value = 6;</code>
       */
      public Builder clearIntValue() {
        bitField0_ = (bitField0_ & ~0x00000020);
        intValue_ = 0;
        onChanged();
        return this;
      }

      // optional bool boolean_value = 7;
      private boolean booleanValue_ ;
      /**
       * <code>optional bool boolean_value = 7;</code>
       */
      public boolean hasBooleanValue() {
        return ((bitField0_ & 0x00000040) == 0x00000040);
      }
      /**
       * <code>optional bool boolean_value = 7;</code>
       */
      public boolean getBooleanValue() {
        return booleanValue_;
      }
      /**
       * <code>optional bool boolean_value = 7;</code>
       */
      public Builder setBooleanValue(boolean value) {
        bitField0_ |= 0x00000040;
        booleanValue_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional bool boolean_value = 7;</code>
       */
      public Builder clearBooleanValue() {
        bitField0_ = (bitField0_ & ~0x00000040);
        booleanValue_ = false;
        onChanged();
        return this;
      }

      // optional int64 datetime_value = 8;
      private long datetimeValue_ ;
      /**
       * <code>optional int64 datetime_value = 8;</code>
       */
      public boolean hasDatetimeValue() {
        return ((bitField0_ & 0x00000080) == 0x00000080);
      }
      /**
       * <code>optional int64 datetime_value = 8;</code>
       */
      public long getDatetimeValue() {
        return datetimeValue_;
      }
      /**
       * <code>optional int64 datetime_value = 8;</code>
       */
      public Builder setDatetimeValue(long value) {
        bitField0_ |= 0x00000080;
        datetimeValue_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional int64 datetime_value = 8;</code>
       */
      public Builder clearDatetimeValue() {
        bitField0_ = (bitField0_ & ~0x00000080);
        datetimeValue_ = 0L;
        onChanged();
        return this;
      }

      // @@protoc_insertion_point(builder_scope:ThingModel.Proto.Property)
    }

    static {
      defaultInstance = new Property(true);
      defaultInstance.initFields();
    }

    // @@protoc_insertion_point(class_scope:ThingModel.Proto.Property)
  }

  public interface PropertyTypeOrBuilder
      extends com.google.protobuf.MessageOrBuilder {

    // required int32 string_key = 1;
    /**
     * <code>required int32 string_key = 1;</code>
     */
    boolean hasStringKey();
    /**
     * <code>required int32 string_key = 1;</code>
     */
    int getStringKey();

    // required .ThingModel.Proto.PropertyType.Type type = 2 [default = STRING];
    /**
     * <code>required .ThingModel.Proto.PropertyType.Type type = 2 [default = STRING];</code>
     */
    boolean hasType();
    /**
     * <code>required .ThingModel.Proto.PropertyType.Type type = 2 [default = STRING];</code>
     */
    ThingModel.Proto.General.PropertyType.Type getType();

    // required bool required = 3 [default = true];
    /**
     * <code>required bool required = 3 [default = true];</code>
     */
    boolean hasRequired();
    /**
     * <code>required bool required = 3 [default = true];</code>
     */
    boolean getRequired();

    // optional int32 string_name = 4;
    /**
     * <code>optional int32 string_name = 4;</code>
     */
    boolean hasStringName();
    /**
     * <code>optional int32 string_name = 4;</code>
     */
    int getStringName();

    // optional int32 string_description = 5;
    /**
     * <code>optional int32 string_description = 5;</code>
     */
    boolean hasStringDescription();
    /**
     * <code>optional int32 string_description = 5;</code>
     */
    int getStringDescription();
  }
  /**
   * Protobuf type {@code ThingModel.Proto.PropertyType}
   */
  public static final class PropertyType extends
      com.google.protobuf.GeneratedMessage
      implements PropertyTypeOrBuilder {
    // Use PropertyType.newBuilder() to construct.
    private PropertyType(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
      super(builder);
      this.unknownFields = builder.getUnknownFields();
    }
    private PropertyType(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

    private static final PropertyType defaultInstance;
    public static PropertyType getDefaultInstance() {
      return defaultInstance;
    }

    public PropertyType getDefaultInstanceForType() {
      return defaultInstance;
    }

    private final com.google.protobuf.UnknownFieldSet unknownFields;
    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
      return this.unknownFields;
    }
    private PropertyType(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      initFields();
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            default: {
              if (!parseUnknownField(input, unknownFields,
                                     extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
            case 8: {
              bitField0_ |= 0x00000001;
              stringKey_ = input.readInt32();
              break;
            }
            case 16: {
              int rawValue = input.readEnum();
              ThingModel.Proto.General.PropertyType.Type value = ThingModel.Proto.General.PropertyType.Type.valueOf(rawValue);
              if (value == null) {
                unknownFields.mergeVarintField(2, rawValue);
              } else {
                bitField0_ |= 0x00000002;
                type_ = value;
              }
              break;
            }
            case 24: {
              bitField0_ |= 0x00000004;
              required_ = input.readBool();
              break;
            }
            case 32: {
              bitField0_ |= 0x00000008;
              stringName_ = input.readInt32();
              break;
            }
            case 40: {
              bitField0_ |= 0x00000010;
              stringDescription_ = input.readInt32();
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e.getMessage()).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return ThingModel.Proto.General.internal_static_ThingModel_Proto_PropertyType_descriptor;
    }

    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return ThingModel.Proto.General.internal_static_ThingModel_Proto_PropertyType_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              ThingModel.Proto.General.PropertyType.class, ThingModel.Proto.General.PropertyType.Builder.class);
    }

    public static com.google.protobuf.Parser<PropertyType> PARSER =
        new com.google.protobuf.AbstractParser<PropertyType>() {
      public PropertyType parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new PropertyType(input, extensionRegistry);
      }
    };

    @java.lang.Override
    public com.google.protobuf.Parser<PropertyType> getParserForType() {
      return PARSER;
    }

    /**
     * Protobuf enum {@code ThingModel.Proto.PropertyType.Type}
     */
    public enum Type
        implements com.google.protobuf.ProtocolMessageEnum {
      /**
       * <code>LOCATION = 0;</code>
       */
      LOCATION(0, 0),
      /**
       * <code>STRING = 1;</code>
       */
      STRING(1, 1),
      /**
       * <code>DOUBLE = 2;</code>
       */
      DOUBLE(2, 2),
      /**
       * <code>INT = 3;</code>
       */
      INT(3, 3),
      /**
       * <code>BOOLEAN = 4;</code>
       */
      BOOLEAN(4, 4),
      /**
       * <code>DATETIME = 5;</code>
       */
      DATETIME(5, 5),
      ;

      /**
       * <code>LOCATION = 0;</code>
       */
      public static final int LOCATION_VALUE = 0;
      /**
       * <code>STRING = 1;</code>
       */
      public static final int STRING_VALUE = 1;
      /**
       * <code>DOUBLE = 2;</code>
       */
      public static final int DOUBLE_VALUE = 2;
      /**
       * <code>INT = 3;</code>
       */
      public static final int INT_VALUE = 3;
      /**
       * <code>BOOLEAN = 4;</code>
       */
      public static final int BOOLEAN_VALUE = 4;
      /**
       * <code>DATETIME = 5;</code>
       */
      public static final int DATETIME_VALUE = 5;


      public final int getNumber() { return value; }

      public static Type valueOf(int value) {
        switch (value) {
          case 0: return LOCATION;
          case 1: return STRING;
          case 2: return DOUBLE;
          case 3: return INT;
          case 4: return BOOLEAN;
          case 5: return DATETIME;
          default: return null;
        }
      }

      public static com.google.protobuf.Internal.EnumLiteMap<Type>
          internalGetValueMap() {
        return internalValueMap;
      }
      private static com.google.protobuf.Internal.EnumLiteMap<Type>
          internalValueMap =
            new com.google.protobuf.Internal.EnumLiteMap<Type>() {
              public Type findValueByNumber(int number) {
                return Type.valueOf(number);
              }
            };

      public final com.google.protobuf.Descriptors.EnumValueDescriptor
          getValueDescriptor() {
        return getDescriptor().getValues().get(index);
      }
      public final com.google.protobuf.Descriptors.EnumDescriptor
          getDescriptorForType() {
        return getDescriptor();
      }
      public static final com.google.protobuf.Descriptors.EnumDescriptor
          getDescriptor() {
        return ThingModel.Proto.General.PropertyType.getDescriptor().getEnumTypes().get(0);
      }

      private static final Type[] VALUES = values();

      public static Type valueOf(
          com.google.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 Type(int index, int value) {
        this.index = index;
        this.value = value;
      }

      // @@protoc_insertion_point(enum_scope:ThingModel.Proto.PropertyType.Type)
    }

    private int bitField0_;
    // required int32 string_key = 1;
    public static final int STRING_KEY_FIELD_NUMBER = 1;
    private int stringKey_;
    /**
     * <code>required int32 string_key = 1;</code>
     */
    public boolean hasStringKey() {
      return ((bitField0_ & 0x00000001) == 0x00000001);
    }
    /**
     * <code>required int32 string_key = 1;</code>
     */
    public int getStringKey() {
      return stringKey_;
    }

    // required .ThingModel.Proto.PropertyType.Type type = 2 [default = STRING];
    public static final int TYPE_FIELD_NUMBER = 2;
    private ThingModel.Proto.General.PropertyType.Type type_;
    /**
     * <code>required .ThingModel.Proto.PropertyType.Type type = 2 [default = STRING];</code>
     */
    public boolean hasType() {
      return ((bitField0_ & 0x00000002) == 0x00000002);
    }
    /**
     * <code>required .ThingModel.Proto.PropertyType.Type type = 2 [default = STRING];</code>
     */
    public ThingModel.Proto.General.PropertyType.Type getType() {
      return type_;
    }

    // required bool required = 3 [default = true];
    public static final int REQUIRED_FIELD_NUMBER = 3;
    private boolean required_;
    /**
     * <code>required bool required = 3 [default = true];</code>
     */
    public boolean hasRequired() {
      return ((bitField0_ & 0x00000004) == 0x00000004);
    }
    /**
     * <code>required bool required = 3 [default = true];</code>
     */
    public boolean getRequired() {
      return required_;
    }

    // optional int32 string_name = 4;
    public static final int STRING_NAME_FIELD_NUMBER = 4;
    private int stringName_;
    /**
     * <code>optional int32 string_name = 4;</code>
     */
    public boolean hasStringName() {
      return ((bitField0_ & 0x00000008) == 0x00000008);
    }
    /**
     * <code>optional int32 string_name = 4;</code>
     */
    public int getStringName() {
      return stringName_;
    }

    // optional int32 string_description = 5;
    public static final int STRING_DESCRIPTION_FIELD_NUMBER = 5;
    private int stringDescription_;
    /**
     * <code>optional int32 string_description = 5;</code>
     */
    public boolean hasStringDescription() {
      return ((bitField0_ & 0x00000010) == 0x00000010);
    }
    /**
     * <code>optional int32 string_description = 5;</code>
     */
    public int getStringDescription() {
      return stringDescription_;
    }

    private void initFields() {
      stringKey_ = 0;
      type_ = ThingModel.Proto.General.PropertyType.Type.STRING;
      required_ = true;
      stringName_ = 0;
      stringDescription_ = 0;
    }
    private byte memoizedIsInitialized = -1;
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized != -1) return isInitialized == 1;

      if (!hasStringKey()) {
        memoizedIsInitialized = 0;
        return false;
      }
      if (!hasType()) {
        memoizedIsInitialized = 0;
        return false;
      }
      if (!hasRequired()) {
        memoizedIsInitialized = 0;
        return false;
      }
      memoizedIsInitialized = 1;
      return true;
    }

    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      getSerializedSize();
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        output.writeInt32(1, stringKey_);
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        output.writeEnum(2, type_.getNumber());
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        output.writeBool(3, required_);
      }
      if (((bitField0_ & 0x00000008) == 0x00000008)) {
        output.writeInt32(4, stringName_);
      }
      if (((bitField0_ & 0x00000010) == 0x00000010)) {
        output.writeInt32(5, stringDescription_);
      }
      getUnknownFields().writeTo(output);
    }

    private int memoizedSerializedSize = -1;
    public int getSerializedSize() {
      int size = memoizedSerializedSize;
      if (size != -1) return size;

      size = 0;
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt32Size(1, stringKey_);
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        size += com.google.protobuf.CodedOutputStream
          .computeEnumSize(2, type_.getNumber());
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBoolSize(3, required_);
      }
      if (((bitField0_ & 0x00000008) == 0x00000008)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt32Size(4, stringName_);
      }
      if (((bitField0_ & 0x00000010) == 0x00000010)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt32Size(5, stringDescription_);
      }
      size += getUnknownFields().getSerializedSize();
      memoizedSerializedSize = size;
      return size;
    }

    private static final long serialVersionUID = 0L;
    @java.lang.Override
    protected java.lang.Object writeReplace()
        throws java.io.ObjectStreamException {
      return super.writeReplace();
    }

    public static ThingModel.Proto.General.PropertyType parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static ThingModel.Proto.General.PropertyType parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static ThingModel.Proto.General.PropertyType parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static ThingModel.Proto.General.PropertyType parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static ThingModel.Proto.General.PropertyType parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static ThingModel.Proto.General.PropertyType parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }
    public static ThingModel.Proto.General.PropertyType parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input);
    }
    public static ThingModel.Proto.General.PropertyType parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input, extensionRegistry);
    }
    public static ThingModel.Proto.General.PropertyType parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static ThingModel.Proto.General.PropertyType parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }

    public static Builder newBuilder() { return Builder.create(); }
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder(ThingModel.Proto.General.PropertyType prototype) {
      return newBuilder().mergeFrom(prototype);
    }
    public Builder toBuilder() { return newBuilder(this); }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code ThingModel.Proto.PropertyType}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessage.Builder<Builder>
       implements ThingModel.Proto.General.PropertyTypeOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return ThingModel.Proto.General.internal_static_ThingModel_Proto_PropertyType_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return ThingModel.Proto.General.internal_static_ThingModel_Proto_PropertyType_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                ThingModel.Proto.General.PropertyType.class, ThingModel.Proto.General.PropertyType.Builder.class);
      }

      // Construct using ThingModel.Proto.General.PropertyType.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
        }
      }
      private static Builder create() {
        return new Builder();
      }

      public Builder clear() {
        super.clear();
        stringKey_ = 0;
        bitField0_ = (bitField0_ & ~0x00000001);
        type_ = ThingModel.Proto.General.PropertyType.Type.STRING;
        bitField0_ = (bitField0_ & ~0x00000002);
        required_ = true;
        bitField0_ = (bitField0_ & ~0x00000004);
        stringName_ = 0;
        bitField0_ = (bitField0_ & ~0x00000008);
        stringDescription_ = 0;
        bitField0_ = (bitField0_ & ~0x00000010);
        return this;
      }

      public Builder clone() {
        return create().mergeFrom(buildPartial());
      }

      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return ThingModel.Proto.General.internal_static_ThingModel_Proto_PropertyType_descriptor;
      }

      public ThingModel.Proto.General.PropertyType getDefaultInstanceForType() {
        return ThingModel.Proto.General.PropertyType.getDefaultInstance();
      }

      public ThingModel.Proto.General.PropertyType build() {
        ThingModel.Proto.General.PropertyType result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      public ThingModel.Proto.General.PropertyType buildPartial() {
        ThingModel.Proto.General.PropertyType result = new ThingModel.Proto.General.PropertyType(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
          to_bitField0_ |= 0x00000001;
        }
        result.stringKey_ = stringKey_;
        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
          to_bitField0_ |= 0x00000002;
        }
        result.type_ = type_;
        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
          to_bitField0_ |= 0x00000004;
        }
        result.required_ = required_;
        if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
          to_bitField0_ |= 0x00000008;
        }
        result.stringName_ = stringName_;
        if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
          to_bitField0_ |= 0x00000010;
        }
        result.stringDescription_ = stringDescription_;
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof ThingModel.Proto.General.PropertyType) {
          return mergeFrom((ThingModel.Proto.General.PropertyType)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(ThingModel.Proto.General.PropertyType other) {
        if (other == ThingModel.Proto.General.PropertyType.getDefaultInstance()) return this;
        if (other.hasStringKey()) {
          setStringKey(other.getStringKey());
        }
        if (other.hasType()) {
          setType(other.getType());
        }
        if (other.hasRequired()) {
          setRequired(other.getRequired());
        }
        if (other.hasStringName()) {
          setStringName(other.getStringName());
        }
        if (other.hasStringDescription()) {
          setStringDescription(other.getStringDescription());
        }
        this.mergeUnknownFields(other.getUnknownFields());
        return this;
      }

      public final boolean isInitialized() {
        if (!hasStringKey()) {
          
          return false;
        }
        if (!hasType()) {
          
          return false;
        }
        if (!hasRequired()) {
          
          return false;
        }
        return true;
      }

      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        ThingModel.Proto.General.PropertyType parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (ThingModel.Proto.General.PropertyType) e.getUnfinishedMessage();
          throw e;
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      // required int32 string_key = 1;
      private int stringKey_ ;
      /**
       * <code>required int32 string_key = 1;</code>
       */
      public boolean hasStringKey() {
        return ((bitField0_ & 0x00000001) == 0x00000001);
      }
      /**
       * <code>required int32 string_key = 1;</code>
       */
      public int getStringKey() {
        return stringKey_;
      }
      /**
       * <code>required int32 string_key = 1;</code>
       */
      public Builder setStringKey(int value) {
        bitField0_ |= 0x00000001;
        stringKey_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>required int32 string_key = 1;</code>
       */
      public Builder clearStringKey() {
        bitField0_ = (bitField0_ & ~0x00000001);
        stringKey_ = 0;
        onChanged();
        return this;
      }

      // required .ThingModel.Proto.PropertyType.Type type = 2 [default = STRING];
      private ThingModel.Proto.General.PropertyType.Type type_ = ThingModel.Proto.General.PropertyType.Type.STRING;
      /**
       * <code>required .ThingModel.Proto.PropertyType.Type type = 2 [default = STRING];</code>
       */
      public boolean hasType() {
        return ((bitField0_ & 0x00000002) == 0x00000002);
      }
      /**
       * <code>required .ThingModel.Proto.PropertyType.Type type = 2 [default = STRING];</code>
       */
      public ThingModel.Proto.General.PropertyType.Type getType() {
        return type_;
      }
      /**
       * <code>required .ThingModel.Proto.PropertyType.Type type = 2 [default = STRING];</code>
       */
      public Builder setType(ThingModel.Proto.General.PropertyType.Type value) {
        if (value == null) {
          throw new NullPointerException();
        }
        bitField0_ |= 0x00000002;
        type_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>required .ThingModel.Proto.PropertyType.Type type = 2 [default = STRING];</code>
       */
      public Builder clearType() {
        bitField0_ = (bitField0_ & ~0x00000002);
        type_ = ThingModel.Proto.General.PropertyType.Type.STRING;
        onChanged();
        return this;
      }

      // required bool required = 3 [default = true];
      private boolean required_ = true;
      /**
       * <code>required bool required = 3 [default = true];</code>
       */
      public boolean hasRequired() {
        return ((bitField0_ & 0x00000004) == 0x00000004);
      }
      /**
       * <code>required bool required = 3 [default = true];</code>
       */
      public boolean getRequired() {
        return required_;
      }
      /**
       * <code>required bool required = 3 [default = true];</code>
       */
      public Builder setRequired(boolean value) {
        bitField0_ |= 0x00000004;
        required_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>required bool required = 3 [default = true];</code>
       */
      public Builder clearRequired() {
        bitField0_ = (bitField0_ & ~0x00000004);
        required_ = true;
        onChanged();
        return this;
      }

      // optional int32 string_name = 4;
      private int stringName_ ;
      /**
       * <code>optional int32 string_name = 4;</code>
       */
      public boolean hasStringName() {
        return ((bitField0_ & 0x00000008) == 0x00000008);
      }
      /**
       * <code>optional int32 string_name = 4;</code>
       */
      public int getStringName() {
        return stringName_;
      }
      /**
       * <code>optional int32 string_name = 4;</code>
       */
      public Builder setStringName(int value) {
        bitField0_ |= 0x00000008;
        stringName_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional int32 string_name = 4;</code>
       */
      public Builder clearStringName() {
        bitField0_ = (bitField0_ & ~0x00000008);
        stringName_ = 0;
        onChanged();
        return this;
      }

      // optional int32 string_description = 5;
      private int stringDescription_ ;
      /**
       * <code>optional int32 string_description = 5;</code>
       */
      public boolean hasStringDescription() {
        return ((bitField0_ & 0x00000010) == 0x00000010);
      }
      /**
       * <code>optional int32 string_description = 5;</code>
       */
      public int getStringDescription() {
        return stringDescription_;
      }
      /**
       * <code>optional int32 string_description = 5;</code>
       */
      public Builder setStringDescription(int value) {
        bitField0_ |= 0x00000010;
        stringDescription_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional int32 string_description = 5;</code>
       */
      public Builder clearStringDescription() {
        bitField0_ = (bitField0_ & ~0x00000010);
        stringDescription_ = 0;
        onChanged();
        return this;
      }

      // @@protoc_insertion_point(builder_scope:ThingModel.Proto.PropertyType)
    }

    static {
      defaultInstance = new PropertyType(true);
      defaultInstance.initFields();
    }

    // @@protoc_insertion_point(class_scope:ThingModel.Proto.PropertyType)
  }

  public interface StringDeclarationOrBuilder
      extends com.google.protobuf.MessageOrBuilder {

    // required string value = 1;
    /**
     * <code>required string value = 1;</code>
     */
    boolean hasValue();
    /**
     * <code>required string value = 1;</code>
     */
    java.lang.String getValue();
    /**
     * <code>required string value = 1;</code>
     */
    com.google.protobuf.ByteString
        getValueBytes();

    // required int32 key = 2;
    /**
     * <code>required int32 key = 2;</code>
     */
    boolean hasKey();
    /**
     * <code>required int32 key = 2;</code>
     */
    int getKey();
  }
  /**
   * Protobuf type {@code ThingModel.Proto.StringDeclaration}
   *
   * <pre>
   **
   *	In order to reduce networks exchanges,
   *	a string must be sent only one time
   *	in the connection lifetime.
   *
   *	The value is the string and the key is a unique
   *	number representing the string.
   *
   *	The key must not be a hash like a truncated
   *	md5 or sha1. Collisions risks are important
   *	with a 32bits key.
   *
   *	Instead, it's better to use a counter. 0 for
   *	the first string decleration, 1 for the second…
   *	And the Protocol Buffers encoding is more efficient
   *	with small numbers.
   *
   *	Each connection should use two dictionaries
   *	between these declarations. One dictionary
   *	for the emission and another one for the reception.
   *
   *	A string declaration can replace a previous one.
   *	It is not possible to remove a string declaration.
   *	Duplicates, the same string with differents keys, are
   *	allowed but developers must try to avoid that.
   * </pre>
   */
  public static final class StringDeclaration extends
      com.google.protobuf.GeneratedMessage
      implements StringDeclarationOrBuilder {
    // Use StringDeclaration.newBuilder() to construct.
    private StringDeclaration(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
      super(builder);
      this.unknownFields = builder.getUnknownFields();
    }
    private StringDeclaration(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

    private static final StringDeclaration defaultInstance;
    public static StringDeclaration getDefaultInstance() {
      return defaultInstance;
    }

    public StringDeclaration getDefaultInstanceForType() {
      return defaultInstance;
    }

    private final com.google.protobuf.UnknownFieldSet unknownFields;
    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
      return this.unknownFields;
    }
    private StringDeclaration(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      initFields();
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            default: {
              if (!parseUnknownField(input, unknownFields,
                                     extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
            case 10: {
              bitField0_ |= 0x00000001;
              value_ = input.readBytes();
              break;
            }
            case 16: {
              bitField0_ |= 0x00000002;
              key_ = input.readInt32();
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e.getMessage()).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return ThingModel.Proto.General.internal_static_ThingModel_Proto_StringDeclaration_descriptor;
    }

    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return ThingModel.Proto.General.internal_static_ThingModel_Proto_StringDeclaration_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              ThingModel.Proto.General.StringDeclaration.class, ThingModel.Proto.General.StringDeclaration.Builder.class);
    }

    public static com.google.protobuf.Parser<StringDeclaration> PARSER =
        new com.google.protobuf.AbstractParser<StringDeclaration>() {
      public StringDeclaration parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new StringDeclaration(input, extensionRegistry);
      }
    };

    @java.lang.Override
    public com.google.protobuf.Parser<StringDeclaration> getParserForType() {
      return PARSER;
    }

    private int bitField0_;
    // required string value = 1;
    public static final int VALUE_FIELD_NUMBER = 1;
    private java.lang.Object value_;
    /**
     * <code>required string value = 1;</code>
     */
    public boolean hasValue() {
      return ((bitField0_ & 0x00000001) == 0x00000001);
    }
    /**
     * <code>required string value = 1;</code>
     */
    public java.lang.String getValue() {
      java.lang.Object ref = value_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          value_ = s;
        }
        return s;
      }
    }
    /**
     * <code>required string value = 1;</code>
     */
    public com.google.protobuf.ByteString
        getValueBytes() {
      java.lang.Object ref = value_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        value_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // required int32 key = 2;
    public static final int KEY_FIELD_NUMBER = 2;
    private int key_;
    /**
     * <code>required int32 key = 2;</code>
     */
    public boolean hasKey() {
      return ((bitField0_ & 0x00000002) == 0x00000002);
    }
    /**
     * <code>required int32 key = 2;</code>
     */
    public int getKey() {
      return key_;
    }

    private void initFields() {
      value_ = "";
      key_ = 0;
    }
    private byte memoizedIsInitialized = -1;
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized != -1) return isInitialized == 1;

      if (!hasValue()) {
        memoizedIsInitialized = 0;
        return false;
      }
      if (!hasKey()) {
        memoizedIsInitialized = 0;
        return false;
      }
      memoizedIsInitialized = 1;
      return true;
    }

    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      getSerializedSize();
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        output.writeBytes(1, getValueBytes());
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        output.writeInt32(2, key_);
      }
      getUnknownFields().writeTo(output);
    }

    private int memoizedSerializedSize = -1;
    public int getSerializedSize() {
      int size = memoizedSerializedSize;
      if (size != -1) return size;

      size = 0;
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(1, getValueBytes());
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt32Size(2, key_);
      }
      size += getUnknownFields().getSerializedSize();
      memoizedSerializedSize = size;
      return size;
    }

    private static final long serialVersionUID = 0L;
    @java.lang.Override
    protected java.lang.Object writeReplace()
        throws java.io.ObjectStreamException {
      return super.writeReplace();
    }

    public static ThingModel.Proto.General.StringDeclaration parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static ThingModel.Proto.General.StringDeclaration parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static ThingModel.Proto.General.StringDeclaration parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static ThingModel.Proto.General.StringDeclaration parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static ThingModel.Proto.General.StringDeclaration parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static ThingModel.Proto.General.StringDeclaration parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }
    public static ThingModel.Proto.General.StringDeclaration parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input);
    }
    public static ThingModel.Proto.General.StringDeclaration parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input, extensionRegistry);
    }
    public static ThingModel.Proto.General.StringDeclaration parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static ThingModel.Proto.General.StringDeclaration parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }

    public static Builder newBuilder() { return Builder.create(); }
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder(ThingModel.Proto.General.StringDeclaration prototype) {
      return newBuilder().mergeFrom(prototype);
    }
    public Builder toBuilder() { return newBuilder(this); }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code ThingModel.Proto.StringDeclaration}
     *
     * <pre>
     **
     *	In order to reduce networks exchanges,
     *	a string must be sent only one time
     *	in the connection lifetime.
     *
     *	The value is the string and the key is a unique
     *	number representing the string.
     *
     *	The key must not be a hash like a truncated
     *	md5 or sha1. Collisions risks are important
     *	with a 32bits key.
     *
     *	Instead, it's better to use a counter. 0 for
     *	the first string decleration, 1 for the second…
     *	And the Protocol Buffers encoding is more efficient
     *	with small numbers.
     *
     *	Each connection should use two dictionaries
     *	between these declarations. One dictionary
     *	for the emission and another one for the reception.
     *
     *	A string declaration can replace a previous one.
     *	It is not possible to remove a string declaration.
     *	Duplicates, the same string with differents keys, are
     *	allowed but developers must try to avoid that.
     * </pre>
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessage.Builder<Builder>
       implements ThingModel.Proto.General.StringDeclarationOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return ThingModel.Proto.General.internal_static_ThingModel_Proto_StringDeclaration_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return ThingModel.Proto.General.internal_static_ThingModel_Proto_StringDeclaration_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                ThingModel.Proto.General.StringDeclaration.class, ThingModel.Proto.General.StringDeclaration.Builder.class);
      }

      // Construct using ThingModel.Proto.General.StringDeclaration.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
        }
      }
      private static Builder create() {
        return new Builder();
      }

      public Builder clear() {
        super.clear();
        value_ = "";
        bitField0_ = (bitField0_ & ~0x00000001);
        key_ = 0;
        bitField0_ = (bitField0_ & ~0x00000002);
        return this;
      }

      public Builder clone() {
        return create().mergeFrom(buildPartial());
      }

      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return ThingModel.Proto.General.internal_static_ThingModel_Proto_StringDeclaration_descriptor;
      }

      public ThingModel.Proto.General.StringDeclaration getDefaultInstanceForType() {
        return ThingModel.Proto.General.StringDeclaration.getDefaultInstance();
      }

      public ThingModel.Proto.General.StringDeclaration build() {
        ThingModel.Proto.General.StringDeclaration result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      public ThingModel.Proto.General.StringDeclaration buildPartial() {
        ThingModel.Proto.General.StringDeclaration result = new ThingModel.Proto.General.StringDeclaration(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
          to_bitField0_ |= 0x00000001;
        }
        result.value_ = value_;
        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
          to_bitField0_ |= 0x00000002;
        }
        result.key_ = key_;
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof ThingModel.Proto.General.StringDeclaration) {
          return mergeFrom((ThingModel.Proto.General.StringDeclaration)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(ThingModel.Proto.General.StringDeclaration other) {
        if (other == ThingModel.Proto.General.StringDeclaration.getDefaultInstance()) return this;
        if (other.hasValue()) {
          bitField0_ |= 0x00000001;
          value_ = other.value_;
          onChanged();
        }
        if (other.hasKey()) {
          setKey(other.getKey());
        }
        this.mergeUnknownFields(other.getUnknownFields());
        return this;
      }

      public final boolean isInitialized() {
        if (!hasValue()) {
          
          return false;
        }
        if (!hasKey()) {
          
          return false;
        }
        return true;
      }

      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        ThingModel.Proto.General.StringDeclaration parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (ThingModel.Proto.General.StringDeclaration) e.getUnfinishedMessage();
          throw e;
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      // required string value = 1;
      private java.lang.Object value_ = "";
      /**
       * <code>required string value = 1;</code>
       */
      public boolean hasValue() {
        return ((bitField0_ & 0x00000001) == 0x00000001);
      }
      /**
       * <code>required string value = 1;</code>
       */
      public java.lang.String getValue() {
        java.lang.Object ref = value_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          value_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>required string value = 1;</code>
       */
      public com.google.protobuf.ByteString
          getValueBytes() {
        java.lang.Object ref = value_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          value_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>required string value = 1;</code>
       */
      public Builder setValue(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
        value_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>required string value = 1;</code>
       */
      public Builder clearValue() {
        bitField0_ = (bitField0_ & ~0x00000001);
        value_ = getDefaultInstance().getValue();
        onChanged();
        return this;
      }
      /**
       * <code>required string value = 1;</code>
       */
      public Builder setValueBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
        value_ = value;
        onChanged();
        return this;
      }

      // required int32 key = 2;
      private int key_ ;
      /**
       * <code>required int32 key = 2;</code>
       */
      public boolean hasKey() {
        return ((bitField0_ & 0x00000002) == 0x00000002);
      }
      /**
       * <code>required int32 key = 2;</code>
       */
      public int getKey() {
        return key_;
      }
      /**
       * <code>required int32 key = 2;</code>
       */
      public Builder setKey(int value) {
        bitField0_ |= 0x00000002;
        key_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>required int32 key = 2;</code>
       */
      public Builder clearKey() {
        bitField0_ = (bitField0_ & ~0x00000002);
        key_ = 0;
        onChanged();
        return this;
      }

      // @@protoc_insertion_point(builder_scope:ThingModel.Proto.StringDeclaration)
    }

    static {
      defaultInstance = new StringDeclaration(true);
      defaultInstance.initFields();
    }

    // @@protoc_insertion_point(class_scope:ThingModel.Proto.StringDeclaration)
  }

  public interface ThingOrBuilder
      extends com.google.protobuf.MessageOrBuilder {

    // required int32 string_id = 1;
    /**
     * <code>required int32 string_id = 1;</code>
     */
    boolean hasStringId();
    /**
     * <code>required int32 string_id = 1;</code>
     */
    int getStringId();

    // required int32 string_type_name = 2;
    /**
     * <code>required int32 string_type_name = 2;</code>
     */
    boolean hasStringTypeName();
    /**
     * <code>required int32 string_type_name = 2;</code>
     */
    int getStringTypeName();

    // repeated .ThingModel.Proto.Property properties = 3;
    /**
     * <code>repeated .ThingModel.Proto.Property properties = 3;</code>
     */
    java.util.List<ThingModel.Proto.General.Property> 
        getPropertiesList();
    /**
     * <code>repeated .ThingModel.Proto.Property properties = 3;</code>
     */
    ThingModel.Proto.General.Property getProperties(int index);
    /**
     * <code>repeated .ThingModel.Proto.Property properties = 3;</code>
     */
    int getPropertiesCount();
    /**
     * <code>repeated .ThingModel.Proto.Property properties = 3;</code>
     */
    java.util.List<? extends ThingModel.Proto.General.PropertyOrBuilder> 
        getPropertiesOrBuilderList();
    /**
     * <code>repeated .ThingModel.Proto.Property properties = 3;</code>
     */
    ThingModel.Proto.General.PropertyOrBuilder getPropertiesOrBuilder(
        int index);

    // repeated int32 connections = 4 [packed = true];
    /**
     * <code>repeated int32 connections = 4 [packed = true];</code>
     *
     * <pre>
     * Use int32 string ids
     * </pre>
     */
    java.util.List<java.lang.Integer> getConnectionsList();
    /**
     * <code>repeated int32 connections = 4 [packed = true];</code>
     *
     * <pre>
     * Use int32 string ids
     * </pre>
     */
    int getConnectionsCount();
    /**
     * <code>repeated int32 connections = 4 [packed = true];</code>
     *
     * <pre>
     * Use int32 string ids
     * </pre>
     */
    int getConnections(int index);

    // optional bool connections_change = 5 [default = false];
    /**
     * <code>optional bool connections_change = 5 [default = false];</code>
     */
    boolean hasConnectionsChange();
    /**
     * <code>optional bool connections_change = 5 [default = false];</code>
     */
    boolean getConnectionsChange();
  }
  /**
   * Protobuf type {@code ThingModel.Proto.Thing}
   */
  public static final class Thing extends
      com.google.protobuf.GeneratedMessage
      implements ThingOrBuilder {
    // Use Thing.newBuilder() to construct.
    private Thing(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
      super(builder);
      this.unknownFields = builder.getUnknownFields();
    }
    private Thing(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

    private static final Thing defaultInstance;
    public static Thing getDefaultInstance() {
      return defaultInstance;
    }

    public Thing getDefaultInstanceForType() {
      return defaultInstance;
    }

    private final com.google.protobuf.UnknownFieldSet unknownFields;
    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
      return this.unknownFields;
    }
    private Thing(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      initFields();
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            default: {
              if (!parseUnknownField(input, unknownFields,
                                     extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
            case 8: {
              bitField0_ |= 0x00000001;
              stringId_ = input.readInt32();
              break;
            }
            case 16: {
              bitField0_ |= 0x00000002;
              stringTypeName_ = input.readInt32();
              break;
            }
            case 26: {
              if (!((mutable_bitField0_ & 0x00000004) == 0x00000004)) {
                properties_ = new java.util.ArrayList<ThingModel.Proto.General.Property>();
                mutable_bitField0_ |= 0x00000004;
              }
              properties_.add(input.readMessage(ThingModel.Proto.General.Property.PARSER, extensionRegistry));
              break;
            }
            case 32: {
              if (!((mutable_bitField0_ & 0x00000008) == 0x00000008)) {
                connections_ = new java.util.ArrayList<java.lang.Integer>();
                mutable_bitField0_ |= 0x00000008;
              }
              connections_.add(input.readInt32());
              break;
            }
            case 34: {
              int length = input.readRawVarint32();
              int limit = input.pushLimit(length);
              if (!((mutable_bitField0_ & 0x00000008) == 0x00000008) && input.getBytesUntilLimit() > 0) {
                connections_ = new java.util.ArrayList<java.lang.Integer>();
                mutable_bitField0_ |= 0x00000008;
              }
              while (input.getBytesUntilLimit() > 0) {
                connections_.add(input.readInt32());
              }
              input.popLimit(limit);
              break;
            }
            case 40: {
              bitField0_ |= 0x00000004;
              connectionsChange_ = input.readBool();
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e.getMessage()).setUnfinishedMessage(this);
      } finally {
        if (((mutable_bitField0_ & 0x00000004) == 0x00000004)) {
          properties_ = java.util.Collections.unmodifiableList(properties_);
        }
        if (((mutable_bitField0_ & 0x00000008) == 0x00000008)) {
          connections_ = java.util.Collections.unmodifiableList(connections_);
        }
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return ThingModel.Proto.General.internal_static_ThingModel_Proto_Thing_descriptor;
    }

    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return ThingModel.Proto.General.internal_static_ThingModel_Proto_Thing_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              ThingModel.Proto.General.Thing.class, ThingModel.Proto.General.Thing.Builder.class);
    }

    public static com.google.protobuf.Parser<Thing> PARSER =
        new com.google.protobuf.AbstractParser<Thing>() {
      public Thing parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new Thing(input, extensionRegistry);
      }
    };

    @java.lang.Override
    public com.google.protobuf.Parser<Thing> getParserForType() {
      return PARSER;
    }

    private int bitField0_;
    // required int32 string_id = 1;
    public static final int STRING_ID_FIELD_NUMBER = 1;
    private int stringId_;
    /**
     * <code>required int32 string_id = 1;</code>
     */
    public boolean hasStringId() {
      return ((bitField0_ & 0x00000001) == 0x00000001);
    }
    /**
     * <code>required int32 string_id = 1;</code>
     */
    public int getStringId() {
      return stringId_;
    }

    // required int32 string_type_name = 2;
    public static final int STRING_TYPE_NAME_FIELD_NUMBER = 2;
    private int stringTypeName_;
    /**
     * <code>required int32 string_type_name = 2;</code>
     */
    public boolean hasStringTypeName() {
      return ((bitField0_ & 0x00000002) == 0x00000002);
    }
    /**
     * <code>required int32 string_type_name = 2;</code>
     */
    public int getStringTypeName() {
      return stringTypeName_;
    }

    // repeated .ThingModel.Proto.Property properties = 3;
    public static final int PROPERTIES_FIELD_NUMBER = 3;
    private java.util.List<ThingModel.Proto.General.Property> properties_;
    /**
     * <code>repeated .ThingModel.Proto.Property properties = 3;</code>
     */
    public java.util.List<ThingModel.Proto.General.Property> getPropertiesList() {
      return properties_;
    }
    /**
     * <code>repeated .ThingModel.Proto.Property properties = 3;</code>
     */
    public java.util.List<? extends ThingModel.Proto.General.PropertyOrBuilder> 
        getPropertiesOrBuilderList() {
      return properties_;
    }
    /**
     * <code>repeated .ThingModel.Proto.Property properties = 3;</code>
     */
    public int getPropertiesCount() {
      return properties_.size();
    }
    /**
     * <code>repeated .ThingModel.Proto.Property properties = 3;</code>
     */
    public ThingModel.Proto.General.Property getProperties(int index) {
      return properties_.get(index);
    }
    /**
     * <code>repeated .ThingModel.Proto.Property properties = 3;</code>
     */
    public ThingModel.Proto.General.PropertyOrBuilder getPropertiesOrBuilder(
        int index) {
      return properties_.get(index);
    }

    // repeated int32 connections = 4 [packed = true];
    public static final int CONNECTIONS_FIELD_NUMBER = 4;
    private java.util.List<java.lang.Integer> connections_;
    /**
     * <code>repeated int32 connections = 4 [packed = true];</code>
     *
     * <pre>
     * Use int32 string ids
     * </pre>
     */
    public java.util.List<java.lang.Integer>
        getConnectionsList() {
      return connections_;
    }
    /**
     * <code>repeated int32 connections = 4 [packed = true];</code>
     *
     * <pre>
     * Use int32 string ids
     * </pre>
     */
    public int getConnectionsCount() {
      return connections_.size();
    }
    /**
     * <code>repeated int32 connections = 4 [packed = true];</code>
     *
     * <pre>
     * Use int32 string ids
     * </pre>
     */
    public int getConnections(int index) {
      return connections_.get(index);
    }
    private int connectionsMemoizedSerializedSize = -1;

    // optional bool connections_change = 5 [default = false];
    public static final int CONNECTIONS_CHANGE_FIELD_NUMBER = 5;
    private boolean connectionsChange_;
    /**
     * <code>optional bool connections_change = 5 [default = false];</code>
     */
    public boolean hasConnectionsChange() {
      return ((bitField0_ & 0x00000004) == 0x00000004);
    }
    /**
     * <code>optional bool connections_change = 5 [default = false];</code>
     */
    public boolean getConnectionsChange() {
      return connectionsChange_;
    }

    private void initFields() {
      stringId_ = 0;
      stringTypeName_ = 0;
      properties_ = java.util.Collections.emptyList();
      connections_ = java.util.Collections.emptyList();
      connectionsChange_ = false;
    }
    private byte memoizedIsInitialized = -1;
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized != -1) return isInitialized == 1;

      if (!hasStringId()) {
        memoizedIsInitialized = 0;
        return false;
      }
      if (!hasStringTypeName()) {
        memoizedIsInitialized = 0;
        return false;
      }
      for (int i = 0; i < getPropertiesCount(); i++) {
        if (!getProperties(i).isInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
      }
      memoizedIsInitialized = 1;
      return true;
    }

    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      getSerializedSize();
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        output.writeInt32(1, stringId_);
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        output.writeInt32(2, stringTypeName_);
      }
      for (int i = 0; i < properties_.size(); i++) {
        output.writeMessage(3, properties_.get(i));
      }
      if (getConnectionsList().size() > 0) {
        output.writeRawVarint32(34);
        output.writeRawVarint32(connectionsMemoizedSerializedSize);
      }
      for (int i = 0; i < connections_.size(); i++) {
        output.writeInt32NoTag(connections_.get(i));
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        output.writeBool(5, connectionsChange_);
      }
      getUnknownFields().writeTo(output);
    }

    private int memoizedSerializedSize = -1;
    public int getSerializedSize() {
      int size = memoizedSerializedSize;
      if (size != -1) return size;

      size = 0;
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt32Size(1, stringId_);
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt32Size(2, stringTypeName_);
      }
      for (int i = 0; i < properties_.size(); i++) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(3, properties_.get(i));
      }
      {
        int dataSize = 0;
        for (int i = 0; i < connections_.size(); i++) {
          dataSize += com.google.protobuf.CodedOutputStream
            .computeInt32SizeNoTag(connections_.get(i));
        }
        size += dataSize;
        if (!getConnectionsList().isEmpty()) {
          size += 1;
          size += com.google.protobuf.CodedOutputStream
              .computeInt32SizeNoTag(dataSize);
        }
        connectionsMemoizedSerializedSize = dataSize;
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBoolSize(5, connectionsChange_);
      }
      size += getUnknownFields().getSerializedSize();
      memoizedSerializedSize = size;
      return size;
    }

    private static final long serialVersionUID = 0L;
    @java.lang.Override
    protected java.lang.Object writeReplace()
        throws java.io.ObjectStreamException {
      return super.writeReplace();
    }

    public static ThingModel.Proto.General.Thing parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static ThingModel.Proto.General.Thing parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static ThingModel.Proto.General.Thing parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static ThingModel.Proto.General.Thing parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static ThingModel.Proto.General.Thing parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static ThingModel.Proto.General.Thing parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }
    public static ThingModel.Proto.General.Thing parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input);
    }
    public static ThingModel.Proto.General.Thing parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input, extensionRegistry);
    }
    public static ThingModel.Proto.General.Thing parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static ThingModel.Proto.General.Thing parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }

    public static Builder newBuilder() { return Builder.create(); }
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder(ThingModel.Proto.General.Thing prototype) {
      return newBuilder().mergeFrom(prototype);
    }
    public Builder toBuilder() { return newBuilder(this); }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code ThingModel.Proto.Thing}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessage.Builder<Builder>
       implements ThingModel.Proto.General.ThingOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return ThingModel.Proto.General.internal_static_ThingModel_Proto_Thing_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return ThingModel.Proto.General.internal_static_ThingModel_Proto_Thing_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                ThingModel.Proto.General.Thing.class, ThingModel.Proto.General.Thing.Builder.class);
      }

      // Construct using ThingModel.Proto.General.Thing.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
          getPropertiesFieldBuilder();
        }
      }
      private static Builder create() {
        return new Builder();
      }

      public Builder clear() {
        super.clear();
        stringId_ = 0;
        bitField0_ = (bitField0_ & ~0x00000001);
        stringTypeName_ = 0;
        bitField0_ = (bitField0_ & ~0x00000002);
        if (propertiesBuilder_ == null) {
          properties_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000004);
        } else {
          propertiesBuilder_.clear();
        }
        connections_ = java.util.Collections.emptyList();
        bitField0_ = (bitField0_ & ~0x00000008);
        connectionsChange_ = false;
        bitField0_ = (bitField0_ & ~0x00000010);
        return this;
      }

      public Builder clone() {
        return create().mergeFrom(buildPartial());
      }

      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return ThingModel.Proto.General.internal_static_ThingModel_Proto_Thing_descriptor;
      }

      public ThingModel.Proto.General.Thing getDefaultInstanceForType() {
        return ThingModel.Proto.General.Thing.getDefaultInstance();
      }

      public ThingModel.Proto.General.Thing build() {
        ThingModel.Proto.General.Thing result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      public ThingModel.Proto.General.Thing buildPartial() {
        ThingModel.Proto.General.Thing result = new ThingModel.Proto.General.Thing(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
          to_bitField0_ |= 0x00000001;
        }
        result.stringId_ = stringId_;
        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
          to_bitField0_ |= 0x00000002;
        }
        result.stringTypeName_ = stringTypeName_;
        if (propertiesBuilder_ == null) {
          if (((bitField0_ & 0x00000004) == 0x00000004)) {
            properties_ = java.util.Collections.unmodifiableList(properties_);
            bitField0_ = (bitField0_ & ~0x00000004);
          }
          result.properties_ = properties_;
        } else {
          result.properties_ = propertiesBuilder_.build();
        }
        if (((bitField0_ & 0x00000008) == 0x00000008)) {
          connections_ = java.util.Collections.unmodifiableList(connections_);
          bitField0_ = (bitField0_ & ~0x00000008);
        }
        result.connections_ = connections_;
        if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
          to_bitField0_ |= 0x00000004;
        }
        result.connectionsChange_ = connectionsChange_;
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof ThingModel.Proto.General.Thing) {
          return mergeFrom((ThingModel.Proto.General.Thing)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(ThingModel.Proto.General.Thing other) {
        if (other == ThingModel.Proto.General.Thing.getDefaultInstance()) return this;
        if (other.hasStringId()) {
          setStringId(other.getStringId());
        }
        if (other.hasStringTypeName()) {
          setStringTypeName(other.getStringTypeName());
        }
        if (propertiesBuilder_ == null) {
          if (!other.properties_.isEmpty()) {
            if (properties_.isEmpty()) {
              properties_ = other.properties_;
              bitField0_ = (bitField0_ & ~0x00000004);
            } else {
              ensurePropertiesIsMutable();
              properties_.addAll(other.properties_);
            }
            onChanged();
          }
        } else {
          if (!other.properties_.isEmpty()) {
            if (propertiesBuilder_.isEmpty()) {
              propertiesBuilder_.dispose();
              propertiesBuilder_ = null;
              properties_ = other.properties_;
              bitField0_ = (bitField0_ & ~0x00000004);
              propertiesBuilder_ = 
                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
                   getPropertiesFieldBuilder() : null;
            } else {
              propertiesBuilder_.addAllMessages(other.properties_);
            }
          }
        }
        if (!other.connections_.isEmpty()) {
          if (connections_.isEmpty()) {
            connections_ = other.connections_;
            bitField0_ = (bitField0_ & ~0x00000008);
          } else {
            ensureConnectionsIsMutable();
            connections_.addAll(other.connections_);
          }
          onChanged();
        }
        if (other.hasConnectionsChange()) {
          setConnectionsChange(other.getConnectionsChange());
        }
        this.mergeUnknownFields(other.getUnknownFields());
        return this;
      }

      public final boolean isInitialized() {
        if (!hasStringId()) {
          
          return false;
        }
        if (!hasStringTypeName()) {
          
          return false;
        }
        for (int i = 0; i < getPropertiesCount(); i++) {
          if (!getProperties(i).isInitialized()) {
            
            return false;
          }
        }
        return true;
      }

      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        ThingModel.Proto.General.Thing parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (ThingModel.Proto.General.Thing) e.getUnfinishedMessage();
          throw e;
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      // required int32 string_id = 1;
      private int stringId_ ;
      /**
       * <code>required int32 string_id = 1;</code>
       */
      public boolean hasStringId() {
        return ((bitField0_ & 0x00000001) == 0x00000001);
      }
      /**
       * <code>required int32 string_id = 1;</code>
       */
      public int getStringId() {
        return stringId_;
      }
      /**
       * <code>required int32 string_id = 1;</code>
       */
      public Builder setStringId(int value) {
        bitField0_ |= 0x00000001;
        stringId_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>required int32 string_id = 1;</code>
       */
      public Builder clearStringId() {
        bitField0_ = (bitField0_ & ~0x00000001);
        stringId_ = 0;
        onChanged();
        return this;
      }

      // required int32 string_type_name = 2;
      private int stringTypeName_ ;
      /**
       * <code>required int32 string_type_name = 2;</code>
       */
      public boolean hasStringTypeName() {
        return ((bitField0_ & 0x00000002) == 0x00000002);
      }
      /**
       * <code>required int32 string_type_name = 2;</code>
       */
      public int getStringTypeName() {
        return stringTypeName_;
      }
      /**
       * <code>required int32 string_type_name = 2;</code>
       */
      public Builder setStringTypeName(int value) {
        bitField0_ |= 0x00000002;
        stringTypeName_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>required int32 string_type_name = 2;</code>
       */
      public Builder clearStringTypeName() {
        bitField0_ = (bitField0_ & ~0x00000002);
        stringTypeName_ = 0;
        onChanged();
        return this;
      }

      // repeated .ThingModel.Proto.Property properties = 3;
      private java.util.List<ThingModel.Proto.General.Property> properties_ =
        java.util.Collections.emptyList();
      private void ensurePropertiesIsMutable() {
        if (!((bitField0_ & 0x00000004) == 0x00000004)) {
          properties_ = new java.util.ArrayList<ThingModel.Proto.General.Property>(properties_);
          bitField0_ |= 0x00000004;
         }
      }

      private com.google.protobuf.RepeatedFieldBuilder<
          ThingModel.Proto.General.Property, ThingModel.Proto.General.Property.Builder, ThingModel.Proto.General.PropertyOrBuilder> propertiesBuilder_;

      /**
       * <code>repeated .ThingModel.Proto.Property properties = 3;</code>
       */
      public java.util.List<ThingModel.Proto.General.Property> getPropertiesList() {
        if (propertiesBuilder_ == null) {
          return java.util.Collections.unmodifiableList(properties_);
        } else {
          return propertiesBuilder_.getMessageList();
        }
      }
      /**
       * <code>repeated .ThingModel.Proto.Property properties = 3;</code>
       */
      public int getPropertiesCount() {
        if (propertiesBuilder_ == null) {
          return properties_.size();
        } else {
          return propertiesBuilder_.getCount();
        }
      }
      /**
       * <code>repeated .ThingModel.Proto.Property properties = 3;</code>
       */
      public ThingModel.Proto.General.Property getProperties(int index) {
        if (propertiesBuilder_ == null) {
          return properties_.get(index);
        } else {
          return propertiesBuilder_.getMessage(index);
        }
      }
      /**
       * <code>repeated .ThingModel.Proto.Property properties = 3;</code>
       */
      public Builder setProperties(
          int index, ThingModel.Proto.General.Property value) {
        if (propertiesBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensurePropertiesIsMutable();
          properties_.set(index, value);
          onChanged();
        } else {
          propertiesBuilder_.setMessage(index, value);
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.Property properties = 3;</code>
       */
      public Builder setProperties(
          int index, ThingModel.Proto.General.Property.Builder builderForValue) {
        if (propertiesBuilder_ == null) {
          ensurePropertiesIsMutable();
          properties_.set(index, builderForValue.build());
          onChanged();
        } else {
          propertiesBuilder_.setMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.Property properties = 3;</code>
       */
      public Builder addProperties(ThingModel.Proto.General.Property value) {
        if (propertiesBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensurePropertiesIsMutable();
          properties_.add(value);
          onChanged();
        } else {
          propertiesBuilder_.addMessage(value);
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.Property properties = 3;</code>
       */
      public Builder addProperties(
          int index, ThingModel.Proto.General.Property value) {
        if (propertiesBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensurePropertiesIsMutable();
          properties_.add(index, value);
          onChanged();
        } else {
          propertiesBuilder_.addMessage(index, value);
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.Property properties = 3;</code>
       */
      public Builder addProperties(
          ThingModel.Proto.General.Property.Builder builderForValue) {
        if (propertiesBuilder_ == null) {
          ensurePropertiesIsMutable();
          properties_.add(builderForValue.build());
          onChanged();
        } else {
          propertiesBuilder_.addMessage(builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.Property properties = 3;</code>
       */
      public Builder addProperties(
          int index, ThingModel.Proto.General.Property.Builder builderForValue) {
        if (propertiesBuilder_ == null) {
          ensurePropertiesIsMutable();
          properties_.add(index, builderForValue.build());
          onChanged();
        } else {
          propertiesBuilder_.addMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.Property properties = 3;</code>
       */
      public Builder addAllProperties(
          java.lang.Iterable<? extends ThingModel.Proto.General.Property> values) {
        if (propertiesBuilder_ == null) {
          ensurePropertiesIsMutable();
          super.addAll(values, properties_);
          onChanged();
        } else {
          propertiesBuilder_.addAllMessages(values);
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.Property properties = 3;</code>
       */
      public Builder clearProperties() {
        if (propertiesBuilder_ == null) {
          properties_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000004);
          onChanged();
        } else {
          propertiesBuilder_.clear();
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.Property properties = 3;</code>
       */
      public Builder removeProperties(int index) {
        if (propertiesBuilder_ == null) {
          ensurePropertiesIsMutable();
          properties_.remove(index);
          onChanged();
        } else {
          propertiesBuilder_.remove(index);
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.Property properties = 3;</code>
       */
      public ThingModel.Proto.General.Property.Builder getPropertiesBuilder(
          int index) {
        return getPropertiesFieldBuilder().getBuilder(index);
      }
      /**
       * <code>repeated .ThingModel.Proto.Property properties = 3;</code>
       */
      public ThingModel.Proto.General.PropertyOrBuilder getPropertiesOrBuilder(
          int index) {
        if (propertiesBuilder_ == null) {
          return properties_.get(index);  } else {
          return propertiesBuilder_.getMessageOrBuilder(index);
        }
      }
      /**
       * <code>repeated .ThingModel.Proto.Property properties = 3;</code>
       */
      public java.util.List<? extends ThingModel.Proto.General.PropertyOrBuilder> 
           getPropertiesOrBuilderList() {
        if (propertiesBuilder_ != null) {
          return propertiesBuilder_.getMessageOrBuilderList();
        } else {
          return java.util.Collections.unmodifiableList(properties_);
        }
      }
      /**
       * <code>repeated .ThingModel.Proto.Property properties = 3;</code>
       */
      public ThingModel.Proto.General.Property.Builder addPropertiesBuilder() {
        return getPropertiesFieldBuilder().addBuilder(
            ThingModel.Proto.General.Property.getDefaultInstance());
      }
      /**
       * <code>repeated .ThingModel.Proto.Property properties = 3;</code>
       */
      public ThingModel.Proto.General.Property.Builder addPropertiesBuilder(
          int index) {
        return getPropertiesFieldBuilder().addBuilder(
            index, ThingModel.Proto.General.Property.getDefaultInstance());
      }
      /**
       * <code>repeated .ThingModel.Proto.Property properties = 3;</code>
       */
      public java.util.List<ThingModel.Proto.General.Property.Builder> 
           getPropertiesBuilderList() {
        return getPropertiesFieldBuilder().getBuilderList();
      }
      private com.google.protobuf.RepeatedFieldBuilder<
          ThingModel.Proto.General.Property, ThingModel.Proto.General.Property.Builder, ThingModel.Proto.General.PropertyOrBuilder> 
          getPropertiesFieldBuilder() {
        if (propertiesBuilder_ == null) {
          propertiesBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
              ThingModel.Proto.General.Property, ThingModel.Proto.General.Property.Builder, ThingModel.Proto.General.PropertyOrBuilder>(
                  properties_,
                  ((bitField0_ & 0x00000004) == 0x00000004),
                  getParentForChildren(),
                  isClean());
          properties_ = null;
        }
        return propertiesBuilder_;
      }

      // repeated int32 connections = 4 [packed = true];
      private java.util.List<java.lang.Integer> connections_ = java.util.Collections.emptyList();
      private void ensureConnectionsIsMutable() {
        if (!((bitField0_ & 0x00000008) == 0x00000008)) {
          connections_ = new java.util.ArrayList<java.lang.Integer>(connections_);
          bitField0_ |= 0x00000008;
         }
      }
      /**
       * <code>repeated int32 connections = 4 [packed = true];</code>
       *
       * <pre>
       * Use int32 string ids
       * </pre>
       */
      public java.util.List<java.lang.Integer>
          getConnectionsList() {
        return java.util.Collections.unmodifiableList(connections_);
      }
      /**
       * <code>repeated int32 connections = 4 [packed = true];</code>
       *
       * <pre>
       * Use int32 string ids
       * </pre>
       */
      public int getConnectionsCount() {
        return connections_.size();
      }
      /**
       * <code>repeated int32 connections = 4 [packed = true];</code>
       *
       * <pre>
       * Use int32 string ids
       * </pre>
       */
      public int getConnections(int index) {
        return connections_.get(index);
      }
      /**
       * <code>repeated int32 connections = 4 [packed = true];</code>
       *
       * <pre>
       * Use int32 string ids
       * </pre>
       */
      public Builder setConnections(
          int index, int value) {
        ensureConnectionsIsMutable();
        connections_.set(index, value);
        onChanged();
        return this;
      }
      /**
       * <code>repeated int32 connections = 4 [packed = true];</code>
       *
       * <pre>
       * Use int32 string ids
       * </pre>
       */
      public Builder addConnections(int value) {
        ensureConnectionsIsMutable();
        connections_.add(value);
        onChanged();
        return this;
      }
      /**
       * <code>repeated int32 connections = 4 [packed = true];</code>
       *
       * <pre>
       * Use int32 string ids
       * </pre>
       */
      public Builder addAllConnections(
          java.lang.Iterable<? extends java.lang.Integer> values) {
        ensureConnectionsIsMutable();
        super.addAll(values, connections_);
        onChanged();
        return this;
      }
      /**
       * <code>repeated int32 connections = 4 [packed = true];</code>
       *
       * <pre>
       * Use int32 string ids
       * </pre>
       */
      public Builder clearConnections() {
        connections_ = java.util.Collections.emptyList();
        bitField0_ = (bitField0_ & ~0x00000008);
        onChanged();
        return this;
      }

      // optional bool connections_change = 5 [default = false];
      private boolean connectionsChange_ ;
      /**
       * <code>optional bool connections_change = 5 [default = false];</code>
       */
      public boolean hasConnectionsChange() {
        return ((bitField0_ & 0x00000010) == 0x00000010);
      }
      /**
       * <code>optional bool connections_change = 5 [default = false];</code>
       */
      public boolean getConnectionsChange() {
        return connectionsChange_;
      }
      /**
       * <code>optional bool connections_change = 5 [default = false];</code>
       */
      public Builder setConnectionsChange(boolean value) {
        bitField0_ |= 0x00000010;
        connectionsChange_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional bool connections_change = 5 [default = false];</code>
       */
      public Builder clearConnectionsChange() {
        bitField0_ = (bitField0_ & ~0x00000010);
        connectionsChange_ = false;
        onChanged();
        return this;
      }

      // @@protoc_insertion_point(builder_scope:ThingModel.Proto.Thing)
    }

    static {
      defaultInstance = new Thing(true);
      defaultInstance.initFields();
    }

    // @@protoc_insertion_point(class_scope:ThingModel.Proto.Thing)
  }

  public interface ThingTypeOrBuilder
      extends com.google.protobuf.MessageOrBuilder {

    // required int32 string_name = 1;
    /**
     * <code>required int32 string_name = 1;</code>
     */
    boolean hasStringName();
    /**
     * <code>required int32 string_name = 1;</code>
     */
    int getStringName();

    // optional int32 string_description = 2;
    /**
     * <code>optional int32 string_description = 2;</code>
     */
    boolean hasStringDescription();
    /**
     * <code>optional int32 string_description = 2;</code>
     */
    int getStringDescription();

    // repeated .ThingModel.Proto.PropertyType properties = 3;
    /**
     * <code>repeated .ThingModel.Proto.PropertyType properties = 3;</code>
     */
    java.util.List<ThingModel.Proto.General.PropertyType> 
        getPropertiesList();
    /**
     * <code>repeated .ThingModel.Proto.PropertyType properties = 3;</code>
     */
    ThingModel.Proto.General.PropertyType getProperties(int index);
    /**
     * <code>repeated .ThingModel.Proto.PropertyType properties = 3;</code>
     */
    int getPropertiesCount();
    /**
     * <code>repeated .ThingModel.Proto.PropertyType properties = 3;</code>
     */
    java.util.List<? extends ThingModel.Proto.General.PropertyTypeOrBuilder> 
        getPropertiesOrBuilderList();
    /**
     * <code>repeated .ThingModel.Proto.PropertyType properties = 3;</code>
     */
    ThingModel.Proto.General.PropertyTypeOrBuilder getPropertiesOrBuilder(
        int index);
  }
  /**
   * Protobuf type {@code ThingModel.Proto.ThingType}
   */
  public static final class ThingType extends
      com.google.protobuf.GeneratedMessage
      implements ThingTypeOrBuilder {
    // Use ThingType.newBuilder() to construct.
    private ThingType(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
      super(builder);
      this.unknownFields = builder.getUnknownFields();
    }
    private ThingType(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

    private static final ThingType defaultInstance;
    public static ThingType getDefaultInstance() {
      return defaultInstance;
    }

    public ThingType getDefaultInstanceForType() {
      return defaultInstance;
    }

    private final com.google.protobuf.UnknownFieldSet unknownFields;
    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
      return this.unknownFields;
    }
    private ThingType(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      initFields();
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            default: {
              if (!parseUnknownField(input, unknownFields,
                                     extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
            case 8: {
              bitField0_ |= 0x00000001;
              stringName_ = input.readInt32();
              break;
            }
            case 16: {
              bitField0_ |= 0x00000002;
              stringDescription_ = input.readInt32();
              break;
            }
            case 26: {
              if (!((mutable_bitField0_ & 0x00000004) == 0x00000004)) {
                properties_ = new java.util.ArrayList<ThingModel.Proto.General.PropertyType>();
                mutable_bitField0_ |= 0x00000004;
              }
              properties_.add(input.readMessage(ThingModel.Proto.General.PropertyType.PARSER, extensionRegistry));
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e.getMessage()).setUnfinishedMessage(this);
      } finally {
        if (((mutable_bitField0_ & 0x00000004) == 0x00000004)) {
          properties_ = java.util.Collections.unmodifiableList(properties_);
        }
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return ThingModel.Proto.General.internal_static_ThingModel_Proto_ThingType_descriptor;
    }

    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return ThingModel.Proto.General.internal_static_ThingModel_Proto_ThingType_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              ThingModel.Proto.General.ThingType.class, ThingModel.Proto.General.ThingType.Builder.class);
    }

    public static com.google.protobuf.Parser<ThingType> PARSER =
        new com.google.protobuf.AbstractParser<ThingType>() {
      public ThingType parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new ThingType(input, extensionRegistry);
      }
    };

    @java.lang.Override
    public com.google.protobuf.Parser<ThingType> getParserForType() {
      return PARSER;
    }

    private int bitField0_;
    // required int32 string_name = 1;
    public static final int STRING_NAME_FIELD_NUMBER = 1;
    private int stringName_;
    /**
     * <code>required int32 string_name = 1;</code>
     */
    public boolean hasStringName() {
      return ((bitField0_ & 0x00000001) == 0x00000001);
    }
    /**
     * <code>required int32 string_name = 1;</code>
     */
    public int getStringName() {
      return stringName_;
    }

    // optional int32 string_description = 2;
    public static final int STRING_DESCRIPTION_FIELD_NUMBER = 2;
    private int stringDescription_;
    /**
     * <code>optional int32 string_description = 2;</code>
     */
    public boolean hasStringDescription() {
      return ((bitField0_ & 0x00000002) == 0x00000002);
    }
    /**
     * <code>optional int32 string_description = 2;</code>
     */
    public int getStringDescription() {
      return stringDescription_;
    }

    // repeated .ThingModel.Proto.PropertyType properties = 3;
    public static final int PROPERTIES_FIELD_NUMBER = 3;
    private java.util.List<ThingModel.Proto.General.PropertyType> properties_;
    /**
     * <code>repeated .ThingModel.Proto.PropertyType properties = 3;</code>
     */
    public java.util.List<ThingModel.Proto.General.PropertyType> getPropertiesList() {
      return properties_;
    }
    /**
     * <code>repeated .ThingModel.Proto.PropertyType properties = 3;</code>
     */
    public java.util.List<? extends ThingModel.Proto.General.PropertyTypeOrBuilder> 
        getPropertiesOrBuilderList() {
      return properties_;
    }
    /**
     * <code>repeated .ThingModel.Proto.PropertyType properties = 3;</code>
     */
    public int getPropertiesCount() {
      return properties_.size();
    }
    /**
     * <code>repeated .ThingModel.Proto.PropertyType properties = 3;</code>
     */
    public ThingModel.Proto.General.PropertyType getProperties(int index) {
      return properties_.get(index);
    }
    /**
     * <code>repeated .ThingModel.Proto.PropertyType properties = 3;</code>
     */
    public ThingModel.Proto.General.PropertyTypeOrBuilder getPropertiesOrBuilder(
        int index) {
      return properties_.get(index);
    }

    private void initFields() {
      stringName_ = 0;
      stringDescription_ = 0;
      properties_ = java.util.Collections.emptyList();
    }
    private byte memoizedIsInitialized = -1;
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized != -1) return isInitialized == 1;

      if (!hasStringName()) {
        memoizedIsInitialized = 0;
        return false;
      }
      for (int i = 0; i < getPropertiesCount(); i++) {
        if (!getProperties(i).isInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
      }
      memoizedIsInitialized = 1;
      return true;
    }

    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      getSerializedSize();
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        output.writeInt32(1, stringName_);
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        output.writeInt32(2, stringDescription_);
      }
      for (int i = 0; i < properties_.size(); i++) {
        output.writeMessage(3, properties_.get(i));
      }
      getUnknownFields().writeTo(output);
    }

    private int memoizedSerializedSize = -1;
    public int getSerializedSize() {
      int size = memoizedSerializedSize;
      if (size != -1) return size;

      size = 0;
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt32Size(1, stringName_);
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt32Size(2, stringDescription_);
      }
      for (int i = 0; i < properties_.size(); i++) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(3, properties_.get(i));
      }
      size += getUnknownFields().getSerializedSize();
      memoizedSerializedSize = size;
      return size;
    }

    private static final long serialVersionUID = 0L;
    @java.lang.Override
    protected java.lang.Object writeReplace()
        throws java.io.ObjectStreamException {
      return super.writeReplace();
    }

    public static ThingModel.Proto.General.ThingType parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static ThingModel.Proto.General.ThingType parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static ThingModel.Proto.General.ThingType parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static ThingModel.Proto.General.ThingType parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static ThingModel.Proto.General.ThingType parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static ThingModel.Proto.General.ThingType parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }
    public static ThingModel.Proto.General.ThingType parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input);
    }
    public static ThingModel.Proto.General.ThingType parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input, extensionRegistry);
    }
    public static ThingModel.Proto.General.ThingType parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static ThingModel.Proto.General.ThingType parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }

    public static Builder newBuilder() { return Builder.create(); }
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder(ThingModel.Proto.General.ThingType prototype) {
      return newBuilder().mergeFrom(prototype);
    }
    public Builder toBuilder() { return newBuilder(this); }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code ThingModel.Proto.ThingType}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessage.Builder<Builder>
       implements ThingModel.Proto.General.ThingTypeOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return ThingModel.Proto.General.internal_static_ThingModel_Proto_ThingType_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return ThingModel.Proto.General.internal_static_ThingModel_Proto_ThingType_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                ThingModel.Proto.General.ThingType.class, ThingModel.Proto.General.ThingType.Builder.class);
      }

      // Construct using ThingModel.Proto.General.ThingType.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
          getPropertiesFieldBuilder();
        }
      }
      private static Builder create() {
        return new Builder();
      }

      public Builder clear() {
        super.clear();
        stringName_ = 0;
        bitField0_ = (bitField0_ & ~0x00000001);
        stringDescription_ = 0;
        bitField0_ = (bitField0_ & ~0x00000002);
        if (propertiesBuilder_ == null) {
          properties_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000004);
        } else {
          propertiesBuilder_.clear();
        }
        return this;
      }

      public Builder clone() {
        return create().mergeFrom(buildPartial());
      }

      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return ThingModel.Proto.General.internal_static_ThingModel_Proto_ThingType_descriptor;
      }

      public ThingModel.Proto.General.ThingType getDefaultInstanceForType() {
        return ThingModel.Proto.General.ThingType.getDefaultInstance();
      }

      public ThingModel.Proto.General.ThingType build() {
        ThingModel.Proto.General.ThingType result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      public ThingModel.Proto.General.ThingType buildPartial() {
        ThingModel.Proto.General.ThingType result = new ThingModel.Proto.General.ThingType(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
          to_bitField0_ |= 0x00000001;
        }
        result.stringName_ = stringName_;
        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
          to_bitField0_ |= 0x00000002;
        }
        result.stringDescription_ = stringDescription_;
        if (propertiesBuilder_ == null) {
          if (((bitField0_ & 0x00000004) == 0x00000004)) {
            properties_ = java.util.Collections.unmodifiableList(properties_);
            bitField0_ = (bitField0_ & ~0x00000004);
          }
          result.properties_ = properties_;
        } else {
          result.properties_ = propertiesBuilder_.build();
        }
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof ThingModel.Proto.General.ThingType) {
          return mergeFrom((ThingModel.Proto.General.ThingType)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(ThingModel.Proto.General.ThingType other) {
        if (other == ThingModel.Proto.General.ThingType.getDefaultInstance()) return this;
        if (other.hasStringName()) {
          setStringName(other.getStringName());
        }
        if (other.hasStringDescription()) {
          setStringDescription(other.getStringDescription());
        }
        if (propertiesBuilder_ == null) {
          if (!other.properties_.isEmpty()) {
            if (properties_.isEmpty()) {
              properties_ = other.properties_;
              bitField0_ = (bitField0_ & ~0x00000004);
            } else {
              ensurePropertiesIsMutable();
              properties_.addAll(other.properties_);
            }
            onChanged();
          }
        } else {
          if (!other.properties_.isEmpty()) {
            if (propertiesBuilder_.isEmpty()) {
              propertiesBuilder_.dispose();
              propertiesBuilder_ = null;
              properties_ = other.properties_;
              bitField0_ = (bitField0_ & ~0x00000004);
              propertiesBuilder_ = 
                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
                   getPropertiesFieldBuilder() : null;
            } else {
              propertiesBuilder_.addAllMessages(other.properties_);
            }
          }
        }
        this.mergeUnknownFields(other.getUnknownFields());
        return this;
      }

      public final boolean isInitialized() {
        if (!hasStringName()) {
          
          return false;
        }
        for (int i = 0; i < getPropertiesCount(); i++) {
          if (!getProperties(i).isInitialized()) {
            
            return false;
          }
        }
        return true;
      }

      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        ThingModel.Proto.General.ThingType parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (ThingModel.Proto.General.ThingType) e.getUnfinishedMessage();
          throw e;
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      // required int32 string_name = 1;
      private int stringName_ ;
      /**
       * <code>required int32 string_name = 1;</code>
       */
      public boolean hasStringName() {
        return ((bitField0_ & 0x00000001) == 0x00000001);
      }
      /**
       * <code>required int32 string_name = 1;</code>
       */
      public int getStringName() {
        return stringName_;
      }
      /**
       * <code>required int32 string_name = 1;</code>
       */
      public Builder setStringName(int value) {
        bitField0_ |= 0x00000001;
        stringName_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>required int32 string_name = 1;</code>
       */
      public Builder clearStringName() {
        bitField0_ = (bitField0_ & ~0x00000001);
        stringName_ = 0;
        onChanged();
        return this;
      }

      // optional int32 string_description = 2;
      private int stringDescription_ ;
      /**
       * <code>optional int32 string_description = 2;</code>
       */
      public boolean hasStringDescription() {
        return ((bitField0_ & 0x00000002) == 0x00000002);
      }
      /**
       * <code>optional int32 string_description = 2;</code>
       */
      public int getStringDescription() {
        return stringDescription_;
      }
      /**
       * <code>optional int32 string_description = 2;</code>
       */
      public Builder setStringDescription(int value) {
        bitField0_ |= 0x00000002;
        stringDescription_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional int32 string_description = 2;</code>
       */
      public Builder clearStringDescription() {
        bitField0_ = (bitField0_ & ~0x00000002);
        stringDescription_ = 0;
        onChanged();
        return this;
      }

      // repeated .ThingModel.Proto.PropertyType properties = 3;
      private java.util.List<ThingModel.Proto.General.PropertyType> properties_ =
        java.util.Collections.emptyList();
      private void ensurePropertiesIsMutable() {
        if (!((bitField0_ & 0x00000004) == 0x00000004)) {
          properties_ = new java.util.ArrayList<ThingModel.Proto.General.PropertyType>(properties_);
          bitField0_ |= 0x00000004;
         }
      }

      private com.google.protobuf.RepeatedFieldBuilder<
          ThingModel.Proto.General.PropertyType, ThingModel.Proto.General.PropertyType.Builder, ThingModel.Proto.General.PropertyTypeOrBuilder> propertiesBuilder_;

      /**
       * <code>repeated .ThingModel.Proto.PropertyType properties = 3;</code>
       */
      public java.util.List<ThingModel.Proto.General.PropertyType> getPropertiesList() {
        if (propertiesBuilder_ == null) {
          return java.util.Collections.unmodifiableList(properties_);
        } else {
          return propertiesBuilder_.getMessageList();
        }
      }
      /**
       * <code>repeated .ThingModel.Proto.PropertyType properties = 3;</code>
       */
      public int getPropertiesCount() {
        if (propertiesBuilder_ == null) {
          return properties_.size();
        } else {
          return propertiesBuilder_.getCount();
        }
      }
      /**
       * <code>repeated .ThingModel.Proto.PropertyType properties = 3;</code>
       */
      public ThingModel.Proto.General.PropertyType getProperties(int index) {
        if (propertiesBuilder_ == null) {
          return properties_.get(index);
        } else {
          return propertiesBuilder_.getMessage(index);
        }
      }
      /**
       * <code>repeated .ThingModel.Proto.PropertyType properties = 3;</code>
       */
      public Builder setProperties(
          int index, ThingModel.Proto.General.PropertyType value) {
        if (propertiesBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensurePropertiesIsMutable();
          properties_.set(index, value);
          onChanged();
        } else {
          propertiesBuilder_.setMessage(index, value);
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.PropertyType properties = 3;</code>
       */
      public Builder setProperties(
          int index, ThingModel.Proto.General.PropertyType.Builder builderForValue) {
        if (propertiesBuilder_ == null) {
          ensurePropertiesIsMutable();
          properties_.set(index, builderForValue.build());
          onChanged();
        } else {
          propertiesBuilder_.setMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.PropertyType properties = 3;</code>
       */
      public Builder addProperties(ThingModel.Proto.General.PropertyType value) {
        if (propertiesBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensurePropertiesIsMutable();
          properties_.add(value);
          onChanged();
        } else {
          propertiesBuilder_.addMessage(value);
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.PropertyType properties = 3;</code>
       */
      public Builder addProperties(
          int index, ThingModel.Proto.General.PropertyType value) {
        if (propertiesBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensurePropertiesIsMutable();
          properties_.add(index, value);
          onChanged();
        } else {
          propertiesBuilder_.addMessage(index, value);
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.PropertyType properties = 3;</code>
       */
      public Builder addProperties(
          ThingModel.Proto.General.PropertyType.Builder builderForValue) {
        if (propertiesBuilder_ == null) {
          ensurePropertiesIsMutable();
          properties_.add(builderForValue.build());
          onChanged();
        } else {
          propertiesBuilder_.addMessage(builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.PropertyType properties = 3;</code>
       */
      public Builder addProperties(
          int index, ThingModel.Proto.General.PropertyType.Builder builderForValue) {
        if (propertiesBuilder_ == null) {
          ensurePropertiesIsMutable();
          properties_.add(index, builderForValue.build());
          onChanged();
        } else {
          propertiesBuilder_.addMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.PropertyType properties = 3;</code>
       */
      public Builder addAllProperties(
          java.lang.Iterable<? extends ThingModel.Proto.General.PropertyType> values) {
        if (propertiesBuilder_ == null) {
          ensurePropertiesIsMutable();
          super.addAll(values, properties_);
          onChanged();
        } else {
          propertiesBuilder_.addAllMessages(values);
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.PropertyType properties = 3;</code>
       */
      public Builder clearProperties() {
        if (propertiesBuilder_ == null) {
          properties_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000004);
          onChanged();
        } else {
          propertiesBuilder_.clear();
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.PropertyType properties = 3;</code>
       */
      public Builder removeProperties(int index) {
        if (propertiesBuilder_ == null) {
          ensurePropertiesIsMutable();
          properties_.remove(index);
          onChanged();
        } else {
          propertiesBuilder_.remove(index);
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.PropertyType properties = 3;</code>
       */
      public ThingModel.Proto.General.PropertyType.Builder getPropertiesBuilder(
          int index) {
        return getPropertiesFieldBuilder().getBuilder(index);
      }
      /**
       * <code>repeated .ThingModel.Proto.PropertyType properties = 3;</code>
       */
      public ThingModel.Proto.General.PropertyTypeOrBuilder getPropertiesOrBuilder(
          int index) {
        if (propertiesBuilder_ == null) {
          return properties_.get(index);  } else {
          return propertiesBuilder_.getMessageOrBuilder(index);
        }
      }
      /**
       * <code>repeated .ThingModel.Proto.PropertyType properties = 3;</code>
       */
      public java.util.List<? extends ThingModel.Proto.General.PropertyTypeOrBuilder> 
           getPropertiesOrBuilderList() {
        if (propertiesBuilder_ != null) {
          return propertiesBuilder_.getMessageOrBuilderList();
        } else {
          return java.util.Collections.unmodifiableList(properties_);
        }
      }
      /**
       * <code>repeated .ThingModel.Proto.PropertyType properties = 3;</code>
       */
      public ThingModel.Proto.General.PropertyType.Builder addPropertiesBuilder() {
        return getPropertiesFieldBuilder().addBuilder(
            ThingModel.Proto.General.PropertyType.getDefaultInstance());
      }
      /**
       * <code>repeated .ThingModel.Proto.PropertyType properties = 3;</code>
       */
      public ThingModel.Proto.General.PropertyType.Builder addPropertiesBuilder(
          int index) {
        return getPropertiesFieldBuilder().addBuilder(
            index, ThingModel.Proto.General.PropertyType.getDefaultInstance());
      }
      /**
       * <code>repeated .ThingModel.Proto.PropertyType properties = 3;</code>
       */
      public java.util.List<ThingModel.Proto.General.PropertyType.Builder> 
           getPropertiesBuilderList() {
        return getPropertiesFieldBuilder().getBuilderList();
      }
      private com.google.protobuf.RepeatedFieldBuilder<
          ThingModel.Proto.General.PropertyType, ThingModel.Proto.General.PropertyType.Builder, ThingModel.Proto.General.PropertyTypeOrBuilder> 
          getPropertiesFieldBuilder() {
        if (propertiesBuilder_ == null) {
          propertiesBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
              ThingModel.Proto.General.PropertyType, ThingModel.Proto.General.PropertyType.Builder, ThingModel.Proto.General.PropertyTypeOrBuilder>(
                  properties_,
                  ((bitField0_ & 0x00000004) == 0x00000004),
                  getParentForChildren(),
                  isClean());
          properties_ = null;
        }
        return propertiesBuilder_;
      }

      // @@protoc_insertion_point(builder_scope:ThingModel.Proto.ThingType)
    }

    static {
      defaultInstance = new ThingType(true);
      defaultInstance.initFields();
    }

    // @@protoc_insertion_point(class_scope:ThingModel.Proto.ThingType)
  }

  public interface TransactionOrBuilder
      extends com.google.protobuf.MessageOrBuilder {

    // repeated .ThingModel.Proto.StringDeclaration string_declarations = 1;
    /**
     * <code>repeated .ThingModel.Proto.StringDeclaration string_declarations = 1;</code>
     */
    java.util.List<ThingModel.Proto.General.StringDeclaration> 
        getStringDeclarationsList();
    /**
     * <code>repeated .ThingModel.Proto.StringDeclaration string_declarations = 1;</code>
     */
    ThingModel.Proto.General.StringDeclaration getStringDeclarations(int index);
    /**
     * <code>repeated .ThingModel.Proto.StringDeclaration string_declarations = 1;</code>
     */
    int getStringDeclarationsCount();
    /**
     * <code>repeated .ThingModel.Proto.StringDeclaration string_declarations = 1;</code>
     */
    java.util.List<? extends ThingModel.Proto.General.StringDeclarationOrBuilder> 
        getStringDeclarationsOrBuilderList();
    /**
     * <code>repeated .ThingModel.Proto.StringDeclaration string_declarations = 1;</code>
     */
    ThingModel.Proto.General.StringDeclarationOrBuilder getStringDeclarationsOrBuilder(
        int index);

    // repeated .ThingModel.Proto.Thing things_publish_list = 2;
    /**
     * <code>repeated .ThingModel.Proto.Thing things_publish_list = 2;</code>
     */
    java.util.List<ThingModel.Proto.General.Thing> 
        getThingsPublishListList();
    /**
     * <code>repeated .ThingModel.Proto.Thing things_publish_list = 2;</code>
     */
    ThingModel.Proto.General.Thing getThingsPublishList(int index);
    /**
     * <code>repeated .ThingModel.Proto.Thing things_publish_list = 2;</code>
     */
    int getThingsPublishListCount();
    /**
     * <code>repeated .ThingModel.Proto.Thing things_publish_list = 2;</code>
     */
    java.util.List<? extends ThingModel.Proto.General.ThingOrBuilder> 
        getThingsPublishListOrBuilderList();
    /**
     * <code>repeated .ThingModel.Proto.Thing things_publish_list = 2;</code>
     */
    ThingModel.Proto.General.ThingOrBuilder getThingsPublishListOrBuilder(
        int index);

    // repeated int32 things_remove_list = 3 [packed = true];
    /**
     * <code>repeated int32 things_remove_list = 3 [packed = true];</code>
     */
    java.util.List<java.lang.Integer> getThingsRemoveListList();
    /**
     * <code>repeated int32 things_remove_list = 3 [packed = true];</code>
     */
    int getThingsRemoveListCount();
    /**
     * <code>repeated int32 things_remove_list = 3 [packed = true];</code>
     */
    int getThingsRemoveList(int index);

    // repeated .ThingModel.Proto.ThingType thingtypes_declaration_list = 4;
    /**
     * <code>repeated .ThingModel.Proto.ThingType thingtypes_declaration_list = 4;</code>
     *
     * <pre>
     * Can be declared once
     * And we can't remove a ThingType
     * </pre>
     */
    java.util.List<ThingModel.Proto.General.ThingType> 
        getThingtypesDeclarationListList();
    /**
     * <code>repeated .ThingModel.Proto.ThingType thingtypes_declaration_list = 4;</code>
     *
     * <pre>
     * Can be declared once
     * And we can't remove a ThingType
     * </pre>
     */
    ThingModel.Proto.General.ThingType getThingtypesDeclarationList(int index);
    /**
     * <code>repeated .ThingModel.Proto.ThingType thingtypes_declaration_list = 4;</code>
     *
     * <pre>
     * Can be declared once
     * And we can't remove a ThingType
     * </pre>
     */
    int getThingtypesDeclarationListCount();
    /**
     * <code>repeated .ThingModel.Proto.ThingType thingtypes_declaration_list = 4;</code>
     *
     * <pre>
     * Can be declared once
     * And we can't remove a ThingType
     * </pre>
     */
    java.util.List<? extends ThingModel.Proto.General.ThingTypeOrBuilder> 
        getThingtypesDeclarationListOrBuilderList();
    /**
     * <code>repeated .ThingModel.Proto.ThingType thingtypes_declaration_list = 4;</code>
     *
     * <pre>
     * Can be declared once
     * And we can't remove a ThingType
     * </pre>
     */
    ThingModel.Proto.General.ThingTypeOrBuilder getThingtypesDeclarationListOrBuilder(
        int index);

    // required int32 string_sender_id = 5;
    /**
     * <code>required int32 string_sender_id = 5;</code>
     *
     * <pre>
     * Identification of the sender
     * </pre>
     */
    boolean hasStringSenderId();
    /**
     * <code>required int32 string_sender_id = 5;</code>
     *
     * <pre>
     * Identification of the sender
     * </pre>
     */
    int getStringSenderId();
  }
  /**
   * Protobuf type {@code ThingModel.Proto.Transaction}
   */
  public static final class Transaction extends
      com.google.protobuf.GeneratedMessage
      implements TransactionOrBuilder {
    // Use Transaction.newBuilder() to construct.
    private Transaction(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
      super(builder);
      this.unknownFields = builder.getUnknownFields();
    }
    private Transaction(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

    private static final Transaction defaultInstance;
    public static Transaction getDefaultInstance() {
      return defaultInstance;
    }

    public Transaction getDefaultInstanceForType() {
      return defaultInstance;
    }

    private final com.google.protobuf.UnknownFieldSet unknownFields;
    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
      return this.unknownFields;
    }
    private Transaction(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      initFields();
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            default: {
              if (!parseUnknownField(input, unknownFields,
                                     extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
            case 10: {
              if (!((mutable_bitField0_ & 0x00000001) == 0x00000001)) {
                stringDeclarations_ = new java.util.ArrayList<ThingModel.Proto.General.StringDeclaration>();
                mutable_bitField0_ |= 0x00000001;
              }
              stringDeclarations_.add(input.readMessage(ThingModel.Proto.General.StringDeclaration.PARSER, extensionRegistry));
              break;
            }
            case 18: {
              if (!((mutable_bitField0_ & 0x00000002) == 0x00000002)) {
                thingsPublishList_ = new java.util.ArrayList<ThingModel.Proto.General.Thing>();
                mutable_bitField0_ |= 0x00000002;
              }
              thingsPublishList_.add(input.readMessage(ThingModel.Proto.General.Thing.PARSER, extensionRegistry));
              break;
            }
            case 24: {
              if (!((mutable_bitField0_ & 0x00000004) == 0x00000004)) {
                thingsRemoveList_ = new java.util.ArrayList<java.lang.Integer>();
                mutable_bitField0_ |= 0x00000004;
              }
              thingsRemoveList_.add(input.readInt32());
              break;
            }
            case 26: {
              int length = input.readRawVarint32();
              int limit = input.pushLimit(length);
              if (!((mutable_bitField0_ & 0x00000004) == 0x00000004) && input.getBytesUntilLimit() > 0) {
                thingsRemoveList_ = new java.util.ArrayList<java.lang.Integer>();
                mutable_bitField0_ |= 0x00000004;
              }
              while (input.getBytesUntilLimit() > 0) {
                thingsRemoveList_.add(input.readInt32());
              }
              input.popLimit(limit);
              break;
            }
            case 34: {
              if (!((mutable_bitField0_ & 0x00000008) == 0x00000008)) {
                thingtypesDeclarationList_ = new java.util.ArrayList<ThingModel.Proto.General.ThingType>();
                mutable_bitField0_ |= 0x00000008;
              }
              thingtypesDeclarationList_.add(input.readMessage(ThingModel.Proto.General.ThingType.PARSER, extensionRegistry));
              break;
            }
            case 40: {
              bitField0_ |= 0x00000001;
              stringSenderId_ = input.readInt32();
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e.getMessage()).setUnfinishedMessage(this);
      } finally {
        if (((mutable_bitField0_ & 0x00000001) == 0x00000001)) {
          stringDeclarations_ = java.util.Collections.unmodifiableList(stringDeclarations_);
        }
        if (((mutable_bitField0_ & 0x00000002) == 0x00000002)) {
          thingsPublishList_ = java.util.Collections.unmodifiableList(thingsPublishList_);
        }
        if (((mutable_bitField0_ & 0x00000004) == 0x00000004)) {
          thingsRemoveList_ = java.util.Collections.unmodifiableList(thingsRemoveList_);
        }
        if (((mutable_bitField0_ & 0x00000008) == 0x00000008)) {
          thingtypesDeclarationList_ = java.util.Collections.unmodifiableList(thingtypesDeclarationList_);
        }
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return ThingModel.Proto.General.internal_static_ThingModel_Proto_Transaction_descriptor;
    }

    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return ThingModel.Proto.General.internal_static_ThingModel_Proto_Transaction_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              ThingModel.Proto.General.Transaction.class, ThingModel.Proto.General.Transaction.Builder.class);
    }

    public static com.google.protobuf.Parser<Transaction> PARSER =
        new com.google.protobuf.AbstractParser<Transaction>() {
      public Transaction parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new Transaction(input, extensionRegistry);
      }
    };

    @java.lang.Override
    public com.google.protobuf.Parser<Transaction> getParserForType() {
      return PARSER;
    }

    private int bitField0_;
    // repeated .ThingModel.Proto.StringDeclaration string_declarations = 1;
    public static final int STRING_DECLARATIONS_FIELD_NUMBER = 1;
    private java.util.List<ThingModel.Proto.General.StringDeclaration> stringDeclarations_;
    /**
     * <code>repeated .ThingModel.Proto.StringDeclaration string_declarations = 1;</code>
     */
    public java.util.List<ThingModel.Proto.General.StringDeclaration> getStringDeclarationsList() {
      return stringDeclarations_;
    }
    /**
     * <code>repeated .ThingModel.Proto.StringDeclaration string_declarations = 1;</code>
     */
    public java.util.List<? extends ThingModel.Proto.General.StringDeclarationOrBuilder> 
        getStringDeclarationsOrBuilderList() {
      return stringDeclarations_;
    }
    /**
     * <code>repeated .ThingModel.Proto.StringDeclaration string_declarations = 1;</code>
     */
    public int getStringDeclarationsCount() {
      return stringDeclarations_.size();
    }
    /**
     * <code>repeated .ThingModel.Proto.StringDeclaration string_declarations = 1;</code>
     */
    public ThingModel.Proto.General.StringDeclaration getStringDeclarations(int index) {
      return stringDeclarations_.get(index);
    }
    /**
     * <code>repeated .ThingModel.Proto.StringDeclaration string_declarations = 1;</code>
     */
    public ThingModel.Proto.General.StringDeclarationOrBuilder getStringDeclarationsOrBuilder(
        int index) {
      return stringDeclarations_.get(index);
    }

    // repeated .ThingModel.Proto.Thing things_publish_list = 2;
    public static final int THINGS_PUBLISH_LIST_FIELD_NUMBER = 2;
    private java.util.List<ThingModel.Proto.General.Thing> thingsPublishList_;
    /**
     * <code>repeated .ThingModel.Proto.Thing things_publish_list = 2;</code>
     */
    public java.util.List<ThingModel.Proto.General.Thing> getThingsPublishListList() {
      return thingsPublishList_;
    }
    /**
     * <code>repeated .ThingModel.Proto.Thing things_publish_list = 2;</code>
     */
    public java.util.List<? extends ThingModel.Proto.General.ThingOrBuilder> 
        getThingsPublishListOrBuilderList() {
      return thingsPublishList_;
    }
    /**
     * <code>repeated .ThingModel.Proto.Thing things_publish_list = 2;</code>
     */
    public int getThingsPublishListCount() {
      return thingsPublishList_.size();
    }
    /**
     * <code>repeated .ThingModel.Proto.Thing things_publish_list = 2;</code>
     */
    public ThingModel.Proto.General.Thing getThingsPublishList(int index) {
      return thingsPublishList_.get(index);
    }
    /**
     * <code>repeated .ThingModel.Proto.Thing things_publish_list = 2;</code>
     */
    public ThingModel.Proto.General.ThingOrBuilder getThingsPublishListOrBuilder(
        int index) {
      return thingsPublishList_.get(index);
    }

    // repeated int32 things_remove_list = 3 [packed = true];
    public static final int THINGS_REMOVE_LIST_FIELD_NUMBER = 3;
    private java.util.List<java.lang.Integer> thingsRemoveList_;
    /**
     * <code>repeated int32 things_remove_list = 3 [packed = true];</code>
     */
    public java.util.List<java.lang.Integer>
        getThingsRemoveListList() {
      return thingsRemoveList_;
    }
    /**
     * <code>repeated int32 things_remove_list = 3 [packed = true];</code>
     */
    public int getThingsRemoveListCount() {
      return thingsRemoveList_.size();
    }
    /**
     * <code>repeated int32 things_remove_list = 3 [packed = true];</code>
     */
    public int getThingsRemoveList(int index) {
      return thingsRemoveList_.get(index);
    }
    private int thingsRemoveListMemoizedSerializedSize = -1;

    // repeated .ThingModel.Proto.ThingType thingtypes_declaration_list = 4;
    public static final int THINGTYPES_DECLARATION_LIST_FIELD_NUMBER = 4;
    private java.util.List<ThingModel.Proto.General.ThingType> thingtypesDeclarationList_;
    /**
     * <code>repeated .ThingModel.Proto.ThingType thingtypes_declaration_list = 4;</code>
     *
     * <pre>
     * Can be declared once
     * And we can't remove a ThingType
     * </pre>
     */
    public java.util.List<ThingModel.Proto.General.ThingType> getThingtypesDeclarationListList() {
      return thingtypesDeclarationList_;
    }
    /**
     * <code>repeated .ThingModel.Proto.ThingType thingtypes_declaration_list = 4;</code>
     *
     * <pre>
     * Can be declared once
     * And we can't remove a ThingType
     * </pre>
     */
    public java.util.List<? extends ThingModel.Proto.General.ThingTypeOrBuilder> 
        getThingtypesDeclarationListOrBuilderList() {
      return thingtypesDeclarationList_;
    }
    /**
     * <code>repeated .ThingModel.Proto.ThingType thingtypes_declaration_list = 4;</code>
     *
     * <pre>
     * Can be declared once
     * And we can't remove a ThingType
     * </pre>
     */
    public int getThingtypesDeclarationListCount() {
      return thingtypesDeclarationList_.size();
    }
    /**
     * <code>repeated .ThingModel.Proto.ThingType thingtypes_declaration_list = 4;</code>
     *
     * <pre>
     * Can be declared once
     * And we can't remove a ThingType
     * </pre>
     */
    public ThingModel.Proto.General.ThingType getThingtypesDeclarationList(int index) {
      return thingtypesDeclarationList_.get(index);
    }
    /**
     * <code>repeated .ThingModel.Proto.ThingType thingtypes_declaration_list = 4;</code>
     *
     * <pre>
     * Can be declared once
     * And we can't remove a ThingType
     * </pre>
     */
    public ThingModel.Proto.General.ThingTypeOrBuilder getThingtypesDeclarationListOrBuilder(
        int index) {
      return thingtypesDeclarationList_.get(index);
    }

    // required int32 string_sender_id = 5;
    public static final int STRING_SENDER_ID_FIELD_NUMBER = 5;
    private int stringSenderId_;
    /**
     * <code>required int32 string_sender_id = 5;</code>
     *
     * <pre>
     * Identification of the sender
     * </pre>
     */
    public boolean hasStringSenderId() {
      return ((bitField0_ & 0x00000001) == 0x00000001);
    }
    /**
     * <code>required int32 string_sender_id = 5;</code>
     *
     * <pre>
     * Identification of the sender
     * </pre>
     */
    public int getStringSenderId() {
      return stringSenderId_;
    }

    private void initFields() {
      stringDeclarations_ = java.util.Collections.emptyList();
      thingsPublishList_ = java.util.Collections.emptyList();
      thingsRemoveList_ = java.util.Collections.emptyList();
      thingtypesDeclarationList_ = java.util.Collections.emptyList();
      stringSenderId_ = 0;
    }
    private byte memoizedIsInitialized = -1;
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized != -1) return isInitialized == 1;

      if (!hasStringSenderId()) {
        memoizedIsInitialized = 0;
        return false;
      }
      for (int i = 0; i < getStringDeclarationsCount(); i++) {
        if (!getStringDeclarations(i).isInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
      }
      for (int i = 0; i < getThingsPublishListCount(); i++) {
        if (!getThingsPublishList(i).isInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
      }
      for (int i = 0; i < getThingtypesDeclarationListCount(); i++) {
        if (!getThingtypesDeclarationList(i).isInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
      }
      memoizedIsInitialized = 1;
      return true;
    }

    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      getSerializedSize();
      for (int i = 0; i < stringDeclarations_.size(); i++) {
        output.writeMessage(1, stringDeclarations_.get(i));
      }
      for (int i = 0; i < thingsPublishList_.size(); i++) {
        output.writeMessage(2, thingsPublishList_.get(i));
      }
      if (getThingsRemoveListList().size() > 0) {
        output.writeRawVarint32(26);
        output.writeRawVarint32(thingsRemoveListMemoizedSerializedSize);
      }
      for (int i = 0; i < thingsRemoveList_.size(); i++) {
        output.writeInt32NoTag(thingsRemoveList_.get(i));
      }
      for (int i = 0; i < thingtypesDeclarationList_.size(); i++) {
        output.writeMessage(4, thingtypesDeclarationList_.get(i));
      }
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        output.writeInt32(5, stringSenderId_);
      }
      getUnknownFields().writeTo(output);
    }

    private int memoizedSerializedSize = -1;
    public int getSerializedSize() {
      int size = memoizedSerializedSize;
      if (size != -1) return size;

      size = 0;
      for (int i = 0; i < stringDeclarations_.size(); i++) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(1, stringDeclarations_.get(i));
      }
      for (int i = 0; i < thingsPublishList_.size(); i++) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(2, thingsPublishList_.get(i));
      }
      {
        int dataSize = 0;
        for (int i = 0; i < thingsRemoveList_.size(); i++) {
          dataSize += com.google.protobuf.CodedOutputStream
            .computeInt32SizeNoTag(thingsRemoveList_.get(i));
        }
        size += dataSize;
        if (!getThingsRemoveListList().isEmpty()) {
          size += 1;
          size += com.google.protobuf.CodedOutputStream
              .computeInt32SizeNoTag(dataSize);
        }
        thingsRemoveListMemoizedSerializedSize = dataSize;
      }
      for (int i = 0; i < thingtypesDeclarationList_.size(); i++) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(4, thingtypesDeclarationList_.get(i));
      }
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt32Size(5, stringSenderId_);
      }
      size += getUnknownFields().getSerializedSize();
      memoizedSerializedSize = size;
      return size;
    }

    private static final long serialVersionUID = 0L;
    @java.lang.Override
    protected java.lang.Object writeReplace()
        throws java.io.ObjectStreamException {
      return super.writeReplace();
    }

    public static ThingModel.Proto.General.Transaction parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static ThingModel.Proto.General.Transaction parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static ThingModel.Proto.General.Transaction parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static ThingModel.Proto.General.Transaction parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static ThingModel.Proto.General.Transaction parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static ThingModel.Proto.General.Transaction parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }
    public static ThingModel.Proto.General.Transaction parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input);
    }
    public static ThingModel.Proto.General.Transaction parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input, extensionRegistry);
    }
    public static ThingModel.Proto.General.Transaction parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static ThingModel.Proto.General.Transaction parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }

    public static Builder newBuilder() { return Builder.create(); }
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder(ThingModel.Proto.General.Transaction prototype) {
      return newBuilder().mergeFrom(prototype);
    }
    public Builder toBuilder() { return newBuilder(this); }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code ThingModel.Proto.Transaction}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessage.Builder<Builder>
       implements ThingModel.Proto.General.TransactionOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return ThingModel.Proto.General.internal_static_ThingModel_Proto_Transaction_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return ThingModel.Proto.General.internal_static_ThingModel_Proto_Transaction_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                ThingModel.Proto.General.Transaction.class, ThingModel.Proto.General.Transaction.Builder.class);
      }

      // Construct using ThingModel.Proto.General.Transaction.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
          getStringDeclarationsFieldBuilder();
          getThingsPublishListFieldBuilder();
          getThingtypesDeclarationListFieldBuilder();
        }
      }
      private static Builder create() {
        return new Builder();
      }

      public Builder clear() {
        super.clear();
        if (stringDeclarationsBuilder_ == null) {
          stringDeclarations_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000001);
        } else {
          stringDeclarationsBuilder_.clear();
        }
        if (thingsPublishListBuilder_ == null) {
          thingsPublishList_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000002);
        } else {
          thingsPublishListBuilder_.clear();
        }
        thingsRemoveList_ = java.util.Collections.emptyList();
        bitField0_ = (bitField0_ & ~0x00000004);
        if (thingtypesDeclarationListBuilder_ == null) {
          thingtypesDeclarationList_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000008);
        } else {
          thingtypesDeclarationListBuilder_.clear();
        }
        stringSenderId_ = 0;
        bitField0_ = (bitField0_ & ~0x00000010);
        return this;
      }

      public Builder clone() {
        return create().mergeFrom(buildPartial());
      }

      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return ThingModel.Proto.General.internal_static_ThingModel_Proto_Transaction_descriptor;
      }

      public ThingModel.Proto.General.Transaction getDefaultInstanceForType() {
        return ThingModel.Proto.General.Transaction.getDefaultInstance();
      }

      public ThingModel.Proto.General.Transaction build() {
        ThingModel.Proto.General.Transaction result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      public ThingModel.Proto.General.Transaction buildPartial() {
        ThingModel.Proto.General.Transaction result = new ThingModel.Proto.General.Transaction(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (stringDeclarationsBuilder_ == null) {
          if (((bitField0_ & 0x00000001) == 0x00000001)) {
            stringDeclarations_ = java.util.Collections.unmodifiableList(stringDeclarations_);
            bitField0_ = (bitField0_ & ~0x00000001);
          }
          result.stringDeclarations_ = stringDeclarations_;
        } else {
          result.stringDeclarations_ = stringDeclarationsBuilder_.build();
        }
        if (thingsPublishListBuilder_ == null) {
          if (((bitField0_ & 0x00000002) == 0x00000002)) {
            thingsPublishList_ = java.util.Collections.unmodifiableList(thingsPublishList_);
            bitField0_ = (bitField0_ & ~0x00000002);
          }
          result.thingsPublishList_ = thingsPublishList_;
        } else {
          result.thingsPublishList_ = thingsPublishListBuilder_.build();
        }
        if (((bitField0_ & 0x00000004) == 0x00000004)) {
          thingsRemoveList_ = java.util.Collections.unmodifiableList(thingsRemoveList_);
          bitField0_ = (bitField0_ & ~0x00000004);
        }
        result.thingsRemoveList_ = thingsRemoveList_;
        if (thingtypesDeclarationListBuilder_ == null) {
          if (((bitField0_ & 0x00000008) == 0x00000008)) {
            thingtypesDeclarationList_ = java.util.Collections.unmodifiableList(thingtypesDeclarationList_);
            bitField0_ = (bitField0_ & ~0x00000008);
          }
          result.thingtypesDeclarationList_ = thingtypesDeclarationList_;
        } else {
          result.thingtypesDeclarationList_ = thingtypesDeclarationListBuilder_.build();
        }
        if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
          to_bitField0_ |= 0x00000001;
        }
        result.stringSenderId_ = stringSenderId_;
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof ThingModel.Proto.General.Transaction) {
          return mergeFrom((ThingModel.Proto.General.Transaction)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(ThingModel.Proto.General.Transaction other) {
        if (other == ThingModel.Proto.General.Transaction.getDefaultInstance()) return this;
        if (stringDeclarationsBuilder_ == null) {
          if (!other.stringDeclarations_.isEmpty()) {
            if (stringDeclarations_.isEmpty()) {
              stringDeclarations_ = other.stringDeclarations_;
              bitField0_ = (bitField0_ & ~0x00000001);
            } else {
              ensureStringDeclarationsIsMutable();
              stringDeclarations_.addAll(other.stringDeclarations_);
            }
            onChanged();
          }
        } else {
          if (!other.stringDeclarations_.isEmpty()) {
            if (stringDeclarationsBuilder_.isEmpty()) {
              stringDeclarationsBuilder_.dispose();
              stringDeclarationsBuilder_ = null;
              stringDeclarations_ = other.stringDeclarations_;
              bitField0_ = (bitField0_ & ~0x00000001);
              stringDeclarationsBuilder_ = 
                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
                   getStringDeclarationsFieldBuilder() : null;
            } else {
              stringDeclarationsBuilder_.addAllMessages(other.stringDeclarations_);
            }
          }
        }
        if (thingsPublishListBuilder_ == null) {
          if (!other.thingsPublishList_.isEmpty()) {
            if (thingsPublishList_.isEmpty()) {
              thingsPublishList_ = other.thingsPublishList_;
              bitField0_ = (bitField0_ & ~0x00000002);
            } else {
              ensureThingsPublishListIsMutable();
              thingsPublishList_.addAll(other.thingsPublishList_);
            }
            onChanged();
          }
        } else {
          if (!other.thingsPublishList_.isEmpty()) {
            if (thingsPublishListBuilder_.isEmpty()) {
              thingsPublishListBuilder_.dispose();
              thingsPublishListBuilder_ = null;
              thingsPublishList_ = other.thingsPublishList_;
              bitField0_ = (bitField0_ & ~0x00000002);
              thingsPublishListBuilder_ = 
                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
                   getThingsPublishListFieldBuilder() : null;
            } else {
              thingsPublishListBuilder_.addAllMessages(other.thingsPublishList_);
            }
          }
        }
        if (!other.thingsRemoveList_.isEmpty()) {
          if (thingsRemoveList_.isEmpty()) {
            thingsRemoveList_ = other.thingsRemoveList_;
            bitField0_ = (bitField0_ & ~0x00000004);
          } else {
            ensureThingsRemoveListIsMutable();
            thingsRemoveList_.addAll(other.thingsRemoveList_);
          }
          onChanged();
        }
        if (thingtypesDeclarationListBuilder_ == null) {
          if (!other.thingtypesDeclarationList_.isEmpty()) {
            if (thingtypesDeclarationList_.isEmpty()) {
              thingtypesDeclarationList_ = other.thingtypesDeclarationList_;
              bitField0_ = (bitField0_ & ~0x00000008);
            } else {
              ensureThingtypesDeclarationListIsMutable();
              thingtypesDeclarationList_.addAll(other.thingtypesDeclarationList_);
            }
            onChanged();
          }
        } else {
          if (!other.thingtypesDeclarationList_.isEmpty()) {
            if (thingtypesDeclarationListBuilder_.isEmpty()) {
              thingtypesDeclarationListBuilder_.dispose();
              thingtypesDeclarationListBuilder_ = null;
              thingtypesDeclarationList_ = other.thingtypesDeclarationList_;
              bitField0_ = (bitField0_ & ~0x00000008);
              thingtypesDeclarationListBuilder_ = 
                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
                   getThingtypesDeclarationListFieldBuilder() : null;
            } else {
              thingtypesDeclarationListBuilder_.addAllMessages(other.thingtypesDeclarationList_);
            }
          }
        }
        if (other.hasStringSenderId()) {
          setStringSenderId(other.getStringSenderId());
        }
        this.mergeUnknownFields(other.getUnknownFields());
        return this;
      }

      public final boolean isInitialized() {
        if (!hasStringSenderId()) {
          
          return false;
        }
        for (int i = 0; i < getStringDeclarationsCount(); i++) {
          if (!getStringDeclarations(i).isInitialized()) {
            
            return false;
          }
        }
        for (int i = 0; i < getThingsPublishListCount(); i++) {
          if (!getThingsPublishList(i).isInitialized()) {
            
            return false;
          }
        }
        for (int i = 0; i < getThingtypesDeclarationListCount(); i++) {
          if (!getThingtypesDeclarationList(i).isInitialized()) {
            
            return false;
          }
        }
        return true;
      }

      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        ThingModel.Proto.General.Transaction parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (ThingModel.Proto.General.Transaction) e.getUnfinishedMessage();
          throw e;
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      // repeated .ThingModel.Proto.StringDeclaration string_declarations = 1;
      private java.util.List<ThingModel.Proto.General.StringDeclaration> stringDeclarations_ =
        java.util.Collections.emptyList();
      private void ensureStringDeclarationsIsMutable() {
        if (!((bitField0_ & 0x00000001) == 0x00000001)) {
          stringDeclarations_ = new java.util.ArrayList<ThingModel.Proto.General.StringDeclaration>(stringDeclarations_);
          bitField0_ |= 0x00000001;
         }
      }

      private com.google.protobuf.RepeatedFieldBuilder<
          ThingModel.Proto.General.StringDeclaration, ThingModel.Proto.General.StringDeclaration.Builder, ThingModel.Proto.General.StringDeclarationOrBuilder> stringDeclarationsBuilder_;

      /**
       * <code>repeated .ThingModel.Proto.StringDeclaration string_declarations = 1;</code>
       */
      public java.util.List<ThingModel.Proto.General.StringDeclaration> getStringDeclarationsList() {
        if (stringDeclarationsBuilder_ == null) {
          return java.util.Collections.unmodifiableList(stringDeclarations_);
        } else {
          return stringDeclarationsBuilder_.getMessageList();
        }
      }
      /**
       * <code>repeated .ThingModel.Proto.StringDeclaration string_declarations = 1;</code>
       */
      public int getStringDeclarationsCount() {
        if (stringDeclarationsBuilder_ == null) {
          return stringDeclarations_.size();
        } else {
          return stringDeclarationsBuilder_.getCount();
        }
      }
      /**
       * <code>repeated .ThingModel.Proto.StringDeclaration string_declarations = 1;</code>
       */
      public ThingModel.Proto.General.StringDeclaration getStringDeclarations(int index) {
        if (stringDeclarationsBuilder_ == null) {
          return stringDeclarations_.get(index);
        } else {
          return stringDeclarationsBuilder_.getMessage(index);
        }
      }
      /**
       * <code>repeated .ThingModel.Proto.StringDeclaration string_declarations = 1;</code>
       */
      public Builder setStringDeclarations(
          int index, ThingModel.Proto.General.StringDeclaration value) {
        if (stringDeclarationsBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureStringDeclarationsIsMutable();
          stringDeclarations_.set(index, value);
          onChanged();
        } else {
          stringDeclarationsBuilder_.setMessage(index, value);
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.StringDeclaration string_declarations = 1;</code>
       */
      public Builder setStringDeclarations(
          int index, ThingModel.Proto.General.StringDeclaration.Builder builderForValue) {
        if (stringDeclarationsBuilder_ == null) {
          ensureStringDeclarationsIsMutable();
          stringDeclarations_.set(index, builderForValue.build());
          onChanged();
        } else {
          stringDeclarationsBuilder_.setMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.StringDeclaration string_declarations = 1;</code>
       */
      public Builder addStringDeclarations(ThingModel.Proto.General.StringDeclaration value) {
        if (stringDeclarationsBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureStringDeclarationsIsMutable();
          stringDeclarations_.add(value);
          onChanged();
        } else {
          stringDeclarationsBuilder_.addMessage(value);
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.StringDeclaration string_declarations = 1;</code>
       */
      public Builder addStringDeclarations(
          int index, ThingModel.Proto.General.StringDeclaration value) {
        if (stringDeclarationsBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureStringDeclarationsIsMutable();
          stringDeclarations_.add(index, value);
          onChanged();
        } else {
          stringDeclarationsBuilder_.addMessage(index, value);
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.StringDeclaration string_declarations = 1;</code>
       */
      public Builder addStringDeclarations(
          ThingModel.Proto.General.StringDeclaration.Builder builderForValue) {
        if (stringDeclarationsBuilder_ == null) {
          ensureStringDeclarationsIsMutable();
          stringDeclarations_.add(builderForValue.build());
          onChanged();
        } else {
          stringDeclarationsBuilder_.addMessage(builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.StringDeclaration string_declarations = 1;</code>
       */
      public Builder addStringDeclarations(
          int index, ThingModel.Proto.General.StringDeclaration.Builder builderForValue) {
        if (stringDeclarationsBuilder_ == null) {
          ensureStringDeclarationsIsMutable();
          stringDeclarations_.add(index, builderForValue.build());
          onChanged();
        } else {
          stringDeclarationsBuilder_.addMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.StringDeclaration string_declarations = 1;</code>
       */
      public Builder addAllStringDeclarations(
          java.lang.Iterable<? extends ThingModel.Proto.General.StringDeclaration> values) {
        if (stringDeclarationsBuilder_ == null) {
          ensureStringDeclarationsIsMutable();
          super.addAll(values, stringDeclarations_);
          onChanged();
        } else {
          stringDeclarationsBuilder_.addAllMessages(values);
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.StringDeclaration string_declarations = 1;</code>
       */
      public Builder clearStringDeclarations() {
        if (stringDeclarationsBuilder_ == null) {
          stringDeclarations_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000001);
          onChanged();
        } else {
          stringDeclarationsBuilder_.clear();
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.StringDeclaration string_declarations = 1;</code>
       */
      public Builder removeStringDeclarations(int index) {
        if (stringDeclarationsBuilder_ == null) {
          ensureStringDeclarationsIsMutable();
          stringDeclarations_.remove(index);
          onChanged();
        } else {
          stringDeclarationsBuilder_.remove(index);
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.StringDeclaration string_declarations = 1;</code>
       */
      public ThingModel.Proto.General.StringDeclaration.Builder getStringDeclarationsBuilder(
          int index) {
        return getStringDeclarationsFieldBuilder().getBuilder(index);
      }
      /**
       * <code>repeated .ThingModel.Proto.StringDeclaration string_declarations = 1;</code>
       */
      public ThingModel.Proto.General.StringDeclarationOrBuilder getStringDeclarationsOrBuilder(
          int index) {
        if (stringDeclarationsBuilder_ == null) {
          return stringDeclarations_.get(index);  } else {
          return stringDeclarationsBuilder_.getMessageOrBuilder(index);
        }
      }
      /**
       * <code>repeated .ThingModel.Proto.StringDeclaration string_declarations = 1;</code>
       */
      public java.util.List<? extends ThingModel.Proto.General.StringDeclarationOrBuilder> 
           getStringDeclarationsOrBuilderList() {
        if (stringDeclarationsBuilder_ != null) {
          return stringDeclarationsBuilder_.getMessageOrBuilderList();
        } else {
          return java.util.Collections.unmodifiableList(stringDeclarations_);
        }
      }
      /**
       * <code>repeated .ThingModel.Proto.StringDeclaration string_declarations = 1;</code>
       */
      public ThingModel.Proto.General.StringDeclaration.Builder addStringDeclarationsBuilder() {
        return getStringDeclarationsFieldBuilder().addBuilder(
            ThingModel.Proto.General.StringDeclaration.getDefaultInstance());
      }
      /**
       * <code>repeated .ThingModel.Proto.StringDeclaration string_declarations = 1;</code>
       */
      public ThingModel.Proto.General.StringDeclaration.Builder addStringDeclarationsBuilder(
          int index) {
        return getStringDeclarationsFieldBuilder().addBuilder(
            index, ThingModel.Proto.General.StringDeclaration.getDefaultInstance());
      }
      /**
       * <code>repeated .ThingModel.Proto.StringDeclaration string_declarations = 1;</code>
       */
      public java.util.List<ThingModel.Proto.General.StringDeclaration.Builder> 
           getStringDeclarationsBuilderList() {
        return getStringDeclarationsFieldBuilder().getBuilderList();
      }
      private com.google.protobuf.RepeatedFieldBuilder<
          ThingModel.Proto.General.StringDeclaration, ThingModel.Proto.General.StringDeclaration.Builder, ThingModel.Proto.General.StringDeclarationOrBuilder> 
          getStringDeclarationsFieldBuilder() {
        if (stringDeclarationsBuilder_ == null) {
          stringDeclarationsBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
              ThingModel.Proto.General.StringDeclaration, ThingModel.Proto.General.StringDeclaration.Builder, ThingModel.Proto.General.StringDeclarationOrBuilder>(
                  stringDeclarations_,
                  ((bitField0_ & 0x00000001) == 0x00000001),
                  getParentForChildren(),
                  isClean());
          stringDeclarations_ = null;
        }
        return stringDeclarationsBuilder_;
      }

      // repeated .ThingModel.Proto.Thing things_publish_list = 2;
      private java.util.List<ThingModel.Proto.General.Thing> thingsPublishList_ =
        java.util.Collections.emptyList();
      private void ensureThingsPublishListIsMutable() {
        if (!((bitField0_ & 0x00000002) == 0x00000002)) {
          thingsPublishList_ = new java.util.ArrayList<ThingModel.Proto.General.Thing>(thingsPublishList_);
          bitField0_ |= 0x00000002;
         }
      }

      private com.google.protobuf.RepeatedFieldBuilder<
          ThingModel.Proto.General.Thing, ThingModel.Proto.General.Thing.Builder, ThingModel.Proto.General.ThingOrBuilder> thingsPublishListBuilder_;

      /**
       * <code>repeated .ThingModel.Proto.Thing things_publish_list = 2;</code>
       */
      public java.util.List<ThingModel.Proto.General.Thing> getThingsPublishListList() {
        if (thingsPublishListBuilder_ == null) {
          return java.util.Collections.unmodifiableList(thingsPublishList_);
        } else {
          return thingsPublishListBuilder_.getMessageList();
        }
      }
      /**
       * <code>repeated .ThingModel.Proto.Thing things_publish_list = 2;</code>
       */
      public int getThingsPublishListCount() {
        if (thingsPublishListBuilder_ == null) {
          return thingsPublishList_.size();
        } else {
          return thingsPublishListBuilder_.getCount();
        }
      }
      /**
       * <code>repeated .ThingModel.Proto.Thing things_publish_list = 2;</code>
       */
      public ThingModel.Proto.General.Thing getThingsPublishList(int index) {
        if (thingsPublishListBuilder_ == null) {
          return thingsPublishList_.get(index);
        } else {
          return thingsPublishListBuilder_.getMessage(index);
        }
      }
      /**
       * <code>repeated .ThingModel.Proto.Thing things_publish_list = 2;</code>
       */
      public Builder setThingsPublishList(
          int index, ThingModel.Proto.General.Thing value) {
        if (thingsPublishListBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureThingsPublishListIsMutable();
          thingsPublishList_.set(index, value);
          onChanged();
        } else {
          thingsPublishListBuilder_.setMessage(index, value);
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.Thing things_publish_list = 2;</code>
       */
      public Builder setThingsPublishList(
          int index, ThingModel.Proto.General.Thing.Builder builderForValue) {
        if (thingsPublishListBuilder_ == null) {
          ensureThingsPublishListIsMutable();
          thingsPublishList_.set(index, builderForValue.build());
          onChanged();
        } else {
          thingsPublishListBuilder_.setMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.Thing things_publish_list = 2;</code>
       */
      public Builder addThingsPublishList(ThingModel.Proto.General.Thing value) {
        if (thingsPublishListBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureThingsPublishListIsMutable();
          thingsPublishList_.add(value);
          onChanged();
        } else {
          thingsPublishListBuilder_.addMessage(value);
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.Thing things_publish_list = 2;</code>
       */
      public Builder addThingsPublishList(
          int index, ThingModel.Proto.General.Thing value) {
        if (thingsPublishListBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureThingsPublishListIsMutable();
          thingsPublishList_.add(index, value);
          onChanged();
        } else {
          thingsPublishListBuilder_.addMessage(index, value);
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.Thing things_publish_list = 2;</code>
       */
      public Builder addThingsPublishList(
          ThingModel.Proto.General.Thing.Builder builderForValue) {
        if (thingsPublishListBuilder_ == null) {
          ensureThingsPublishListIsMutable();
          thingsPublishList_.add(builderForValue.build());
          onChanged();
        } else {
          thingsPublishListBuilder_.addMessage(builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.Thing things_publish_list = 2;</code>
       */
      public Builder addThingsPublishList(
          int index, ThingModel.Proto.General.Thing.Builder builderForValue) {
        if (thingsPublishListBuilder_ == null) {
          ensureThingsPublishListIsMutable();
          thingsPublishList_.add(index, builderForValue.build());
          onChanged();
        } else {
          thingsPublishListBuilder_.addMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.Thing things_publish_list = 2;</code>
       */
      public Builder addAllThingsPublishList(
          java.lang.Iterable<? extends ThingModel.Proto.General.Thing> values) {
        if (thingsPublishListBuilder_ == null) {
          ensureThingsPublishListIsMutable();
          super.addAll(values, thingsPublishList_);
          onChanged();
        } else {
          thingsPublishListBuilder_.addAllMessages(values);
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.Thing things_publish_list = 2;</code>
       */
      public Builder clearThingsPublishList() {
        if (thingsPublishListBuilder_ == null) {
          thingsPublishList_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000002);
          onChanged();
        } else {
          thingsPublishListBuilder_.clear();
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.Thing things_publish_list = 2;</code>
       */
      public Builder removeThingsPublishList(int index) {
        if (thingsPublishListBuilder_ == null) {
          ensureThingsPublishListIsMutable();
          thingsPublishList_.remove(index);
          onChanged();
        } else {
          thingsPublishListBuilder_.remove(index);
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.Thing things_publish_list = 2;</code>
       */
      public ThingModel.Proto.General.Thing.Builder getThingsPublishListBuilder(
          int index) {
        return getThingsPublishListFieldBuilder().getBuilder(index);
      }
      /**
       * <code>repeated .ThingModel.Proto.Thing things_publish_list = 2;</code>
       */
      public ThingModel.Proto.General.ThingOrBuilder getThingsPublishListOrBuilder(
          int index) {
        if (thingsPublishListBuilder_ == null) {
          return thingsPublishList_.get(index);  } else {
          return thingsPublishListBuilder_.getMessageOrBuilder(index);
        }
      }
      /**
       * <code>repeated .ThingModel.Proto.Thing things_publish_list = 2;</code>
       */
      public java.util.List<? extends ThingModel.Proto.General.ThingOrBuilder> 
           getThingsPublishListOrBuilderList() {
        if (thingsPublishListBuilder_ != null) {
          return thingsPublishListBuilder_.getMessageOrBuilderList();
        } else {
          return java.util.Collections.unmodifiableList(thingsPublishList_);
        }
      }
      /**
       * <code>repeated .ThingModel.Proto.Thing things_publish_list = 2;</code>
       */
      public ThingModel.Proto.General.Thing.Builder addThingsPublishListBuilder() {
        return getThingsPublishListFieldBuilder().addBuilder(
            ThingModel.Proto.General.Thing.getDefaultInstance());
      }
      /**
       * <code>repeated .ThingModel.Proto.Thing things_publish_list = 2;</code>
       */
      public ThingModel.Proto.General.Thing.Builder addThingsPublishListBuilder(
          int index) {
        return getThingsPublishListFieldBuilder().addBuilder(
            index, ThingModel.Proto.General.Thing.getDefaultInstance());
      }
      /**
       * <code>repeated .ThingModel.Proto.Thing things_publish_list = 2;</code>
       */
      public java.util.List<ThingModel.Proto.General.Thing.Builder> 
           getThingsPublishListBuilderList() {
        return getThingsPublishListFieldBuilder().getBuilderList();
      }
      private com.google.protobuf.RepeatedFieldBuilder<
          ThingModel.Proto.General.Thing, ThingModel.Proto.General.Thing.Builder, ThingModel.Proto.General.ThingOrBuilder> 
          getThingsPublishListFieldBuilder() {
        if (thingsPublishListBuilder_ == null) {
          thingsPublishListBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
              ThingModel.Proto.General.Thing, ThingModel.Proto.General.Thing.Builder, ThingModel.Proto.General.ThingOrBuilder>(
                  thingsPublishList_,
                  ((bitField0_ & 0x00000002) == 0x00000002),
                  getParentForChildren(),
                  isClean());
          thingsPublishList_ = null;
        }
        return thingsPublishListBuilder_;
      }

      // repeated int32 things_remove_list = 3 [packed = true];
      private java.util.List<java.lang.Integer> thingsRemoveList_ = java.util.Collections.emptyList();
      private void ensureThingsRemoveListIsMutable() {
        if (!((bitField0_ & 0x00000004) == 0x00000004)) {
          thingsRemoveList_ = new java.util.ArrayList<java.lang.Integer>(thingsRemoveList_);
          bitField0_ |= 0x00000004;
         }
      }
      /**
       * <code>repeated int32 things_remove_list = 3 [packed = true];</code>
       */
      public java.util.List<java.lang.Integer>
          getThingsRemoveListList() {
        return java.util.Collections.unmodifiableList(thingsRemoveList_);
      }
      /**
       * <code>repeated int32 things_remove_list = 3 [packed = true];</code>
       */
      public int getThingsRemoveListCount() {
        return thingsRemoveList_.size();
      }
      /**
       * <code>repeated int32 things_remove_list = 3 [packed = true];</code>
       */
      public int getThingsRemoveList(int index) {
        return thingsRemoveList_.get(index);
      }
      /**
       * <code>repeated int32 things_remove_list = 3 [packed = true];</code>
       */
      public Builder setThingsRemoveList(
          int index, int value) {
        ensureThingsRemoveListIsMutable();
        thingsRemoveList_.set(index, value);
        onChanged();
        return this;
      }
      /**
       * <code>repeated int32 things_remove_list = 3 [packed = true];</code>
       */
      public Builder addThingsRemoveList(int value) {
        ensureThingsRemoveListIsMutable();
        thingsRemoveList_.add(value);
        onChanged();
        return this;
      }
      /**
       * <code>repeated int32 things_remove_list = 3 [packed = true];</code>
       */
      public Builder addAllThingsRemoveList(
          java.lang.Iterable<? extends java.lang.Integer> values) {
        ensureThingsRemoveListIsMutable();
        super.addAll(values, thingsRemoveList_);
        onChanged();
        return this;
      }
      /**
       * <code>repeated int32 things_remove_list = 3 [packed = true];</code>
       */
      public Builder clearThingsRemoveList() {
        thingsRemoveList_ = java.util.Collections.emptyList();
        bitField0_ = (bitField0_ & ~0x00000004);
        onChanged();
        return this;
      }

      // repeated .ThingModel.Proto.ThingType thingtypes_declaration_list = 4;
      private java.util.List<ThingModel.Proto.General.ThingType> thingtypesDeclarationList_ =
        java.util.Collections.emptyList();
      private void ensureThingtypesDeclarationListIsMutable() {
        if (!((bitField0_ & 0x00000008) == 0x00000008)) {
          thingtypesDeclarationList_ = new java.util.ArrayList<ThingModel.Proto.General.ThingType>(thingtypesDeclarationList_);
          bitField0_ |= 0x00000008;
         }
      }

      private com.google.protobuf.RepeatedFieldBuilder<
          ThingModel.Proto.General.ThingType, ThingModel.Proto.General.ThingType.Builder, ThingModel.Proto.General.ThingTypeOrBuilder> thingtypesDeclarationListBuilder_;

      /**
       * <code>repeated .ThingModel.Proto.ThingType thingtypes_declaration_list = 4;</code>
       *
       * <pre>
       * Can be declared once
       * And we can't remove a ThingType
       * </pre>
       */
      public java.util.List<ThingModel.Proto.General.ThingType> getThingtypesDeclarationListList() {
        if (thingtypesDeclarationListBuilder_ == null) {
          return java.util.Collections.unmodifiableList(thingtypesDeclarationList_);
        } else {
          return thingtypesDeclarationListBuilder_.getMessageList();
        }
      }
      /**
       * <code>repeated .ThingModel.Proto.ThingType thingtypes_declaration_list = 4;</code>
       *
       * <pre>
       * Can be declared once
       * And we can't remove a ThingType
       * </pre>
       */
      public int getThingtypesDeclarationListCount() {
        if (thingtypesDeclarationListBuilder_ == null) {
          return thingtypesDeclarationList_.size();
        } else {
          return thingtypesDeclarationListBuilder_.getCount();
        }
      }
      /**
       * <code>repeated .ThingModel.Proto.ThingType thingtypes_declaration_list = 4;</code>
       *
       * <pre>
       * Can be declared once
       * And we can't remove a ThingType
       * </pre>
       */
      public ThingModel.Proto.General.ThingType getThingtypesDeclarationList(int index) {
        if (thingtypesDeclarationListBuilder_ == null) {
          return thingtypesDeclarationList_.get(index);
        } else {
          return thingtypesDeclarationListBuilder_.getMessage(index);
        }
      }
      /**
       * <code>repeated .ThingModel.Proto.ThingType thingtypes_declaration_list = 4;</code>
       *
       * <pre>
       * Can be declared once
       * And we can't remove a ThingType
       * </pre>
       */
      public Builder setThingtypesDeclarationList(
          int index, ThingModel.Proto.General.ThingType value) {
        if (thingtypesDeclarationListBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureThingtypesDeclarationListIsMutable();
          thingtypesDeclarationList_.set(index, value);
          onChanged();
        } else {
          thingtypesDeclarationListBuilder_.setMessage(index, value);
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.ThingType thingtypes_declaration_list = 4;</code>
       *
       * <pre>
       * Can be declared once
       * And we can't remove a ThingType
       * </pre>
       */
      public Builder setThingtypesDeclarationList(
          int index, ThingModel.Proto.General.ThingType.Builder builderForValue) {
        if (thingtypesDeclarationListBuilder_ == null) {
          ensureThingtypesDeclarationListIsMutable();
          thingtypesDeclarationList_.set(index, builderForValue.build());
          onChanged();
        } else {
          thingtypesDeclarationListBuilder_.setMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.ThingType thingtypes_declaration_list = 4;</code>
       *
       * <pre>
       * Can be declared once
       * And we can't remove a ThingType
       * </pre>
       */
      public Builder addThingtypesDeclarationList(ThingModel.Proto.General.ThingType value) {
        if (thingtypesDeclarationListBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureThingtypesDeclarationListIsMutable();
          thingtypesDeclarationList_.add(value);
          onChanged();
        } else {
          thingtypesDeclarationListBuilder_.addMessage(value);
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.ThingType thingtypes_declaration_list = 4;</code>
       *
       * <pre>
       * Can be declared once
       * And we can't remove a ThingType
       * </pre>
       */
      public Builder addThingtypesDeclarationList(
          int index, ThingModel.Proto.General.ThingType value) {
        if (thingtypesDeclarationListBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureThingtypesDeclarationListIsMutable();
          thingtypesDeclarationList_.add(index, value);
          onChanged();
        } else {
          thingtypesDeclarationListBuilder_.addMessage(index, value);
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.ThingType thingtypes_declaration_list = 4;</code>
       *
       * <pre>
       * Can be declared once
       * And we can't remove a ThingType
       * </pre>
       */
      public Builder addThingtypesDeclarationList(
          ThingModel.Proto.General.ThingType.Builder builderForValue) {
        if (thingtypesDeclarationListBuilder_ == null) {
          ensureThingtypesDeclarationListIsMutable();
          thingtypesDeclarationList_.add(builderForValue.build());
          onChanged();
        } else {
          thingtypesDeclarationListBuilder_.addMessage(builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.ThingType thingtypes_declaration_list = 4;</code>
       *
       * <pre>
       * Can be declared once
       * And we can't remove a ThingType
       * </pre>
       */
      public Builder addThingtypesDeclarationList(
          int index, ThingModel.Proto.General.ThingType.Builder builderForValue) {
        if (thingtypesDeclarationListBuilder_ == null) {
          ensureThingtypesDeclarationListIsMutable();
          thingtypesDeclarationList_.add(index, builderForValue.build());
          onChanged();
        } else {
          thingtypesDeclarationListBuilder_.addMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.ThingType thingtypes_declaration_list = 4;</code>
       *
       * <pre>
       * Can be declared once
       * And we can't remove a ThingType
       * </pre>
       */
      public Builder addAllThingtypesDeclarationList(
          java.lang.Iterable<? extends ThingModel.Proto.General.ThingType> values) {
        if (thingtypesDeclarationListBuilder_ == null) {
          ensureThingtypesDeclarationListIsMutable();
          super.addAll(values, thingtypesDeclarationList_);
          onChanged();
        } else {
          thingtypesDeclarationListBuilder_.addAllMessages(values);
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.ThingType thingtypes_declaration_list = 4;</code>
       *
       * <pre>
       * Can be declared once
       * And we can't remove a ThingType
       * </pre>
       */
      public Builder clearThingtypesDeclarationList() {
        if (thingtypesDeclarationListBuilder_ == null) {
          thingtypesDeclarationList_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000008);
          onChanged();
        } else {
          thingtypesDeclarationListBuilder_.clear();
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.ThingType thingtypes_declaration_list = 4;</code>
       *
       * <pre>
       * Can be declared once
       * And we can't remove a ThingType
       * </pre>
       */
      public Builder removeThingtypesDeclarationList(int index) {
        if (thingtypesDeclarationListBuilder_ == null) {
          ensureThingtypesDeclarationListIsMutable();
          thingtypesDeclarationList_.remove(index);
          onChanged();
        } else {
          thingtypesDeclarationListBuilder_.remove(index);
        }
        return this;
      }
      /**
       * <code>repeated .ThingModel.Proto.ThingType thingtypes_declaration_list = 4;</code>
       *
       * <pre>
       * Can be declared once
       * And we can't remove a ThingType
       * </pre>
       */
      public ThingModel.Proto.General.ThingType.Builder getThingtypesDeclarationListBuilder(
          int index) {
        return getThingtypesDeclarationListFieldBuilder().getBuilder(index);
      }
      /**
       * <code>repeated .ThingModel.Proto.ThingType thingtypes_declaration_list = 4;</code>
       *
       * <pre>
       * Can be declared once
       * And we can't remove a ThingType
       * </pre>
       */
      public ThingModel.Proto.General.ThingTypeOrBuilder getThingtypesDeclarationListOrBuilder(
          int index) {
        if (thingtypesDeclarationListBuilder_ == null) {
          return thingtypesDeclarationList_.get(index);  } else {
          return thingtypesDeclarationListBuilder_.getMessageOrBuilder(index);
        }
      }
      /**
       * <code>repeated .ThingModel.Proto.ThingType thingtypes_declaration_list = 4;</code>
       *
       * <pre>
       * Can be declared once
       * And we can't remove a ThingType
       * </pre>
       */
      public java.util.List<? extends ThingModel.Proto.General.ThingTypeOrBuilder> 
           getThingtypesDeclarationListOrBuilderList() {
        if (thingtypesDeclarationListBuilder_ != null) {
          return thingtypesDeclarationListBuilder_.getMessageOrBuilderList();
        } else {
          return java.util.Collections.unmodifiableList(thingtypesDeclarationList_);
        }
      }
      /**
       * <code>repeated .ThingModel.Proto.ThingType thingtypes_declaration_list = 4;</code>
       *
       * <pre>
       * Can be declared once
       * And we can't remove a ThingType
       * </pre>
       */
      public ThingModel.Proto.General.ThingType.Builder addThingtypesDeclarationListBuilder() {
        return getThingtypesDeclarationListFieldBuilder().addBuilder(
            ThingModel.Proto.General.ThingType.getDefaultInstance());
      }
      /**
       * <code>repeated .ThingModel.Proto.ThingType thingtypes_declaration_list = 4;</code>
       *
       * <pre>
       * Can be declared once
       * And we can't remove a ThingType
       * </pre>
       */
      public ThingModel.Proto.General.ThingType.Builder addThingtypesDeclarationListBuilder(
          int index) {
        return getThingtypesDeclarationListFieldBuilder().addBuilder(
            index, ThingModel.Proto.General.ThingType.getDefaultInstance());
      }
      /**
       * <code>repeated .ThingModel.Proto.ThingType thingtypes_declaration_list = 4;</code>
       *
       * <pre>
       * Can be declared once
       * And we can't remove a ThingType
       * </pre>
       */
      public java.util.List<ThingModel.Proto.General.ThingType.Builder> 
           getThingtypesDeclarationListBuilderList() {
        return getThingtypesDeclarationListFieldBuilder().getBuilderList();
      }
      private com.google.protobuf.RepeatedFieldBuilder<
          ThingModel.Proto.General.ThingType, ThingModel.Proto.General.ThingType.Builder, ThingModel.Proto.General.ThingTypeOrBuilder> 
          getThingtypesDeclarationListFieldBuilder() {
        if (thingtypesDeclarationListBuilder_ == null) {
          thingtypesDeclarationListBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
              ThingModel.Proto.General.ThingType, ThingModel.Proto.General.ThingType.Builder, ThingModel.Proto.General.ThingTypeOrBuilder>(
                  thingtypesDeclarationList_,
                  ((bitField0_ & 0x00000008) == 0x00000008),
                  getParentForChildren(),
                  isClean());
          thingtypesDeclarationList_ = null;
        }
        return thingtypesDeclarationListBuilder_;
      }

      // required int32 string_sender_id = 5;
      private int stringSenderId_ ;
      /**
       * <code>required int32 string_sender_id = 5;</code>
       *
       * <pre>
       * Identification of the sender
       * </pre>
       */
      public boolean hasStringSenderId() {
        return ((bitField0_ & 0x00000010) == 0x00000010);
      }
      /**
       * <code>required int32 string_sender_id = 5;</code>
       *
       * <pre>
       * Identification of the sender
       * </pre>
       */
      public int getStringSenderId() {
        return stringSenderId_;
      }
      /**
       * <code>required int32 string_sender_id = 5;</code>
       *
       * <pre>
       * Identification of the sender
       * </pre>
       */
      public Builder setStringSenderId(int value) {
        bitField0_ |= 0x00000010;
        stringSenderId_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>required int32 string_sender_id = 5;</code>
       *
       * <pre>
       * Identification of the sender
       * </pre>
       */
      public Builder clearStringSenderId() {
        bitField0_ = (bitField0_ & ~0x00000010);
        stringSenderId_ = 0;
        onChanged();
        return this;
      }

      // @@protoc_insertion_point(builder_scope:ThingModel.Proto.Transaction)
    }

    static {
      defaultInstance = new Transaction(true);
      defaultInstance.initFields();
    }

    // @@protoc_insertion_point(class_scope:ThingModel.Proto.Transaction)
  }

  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_ThingModel_Proto_Property_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_ThingModel_Proto_Property_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_ThingModel_Proto_Property_Location_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_ThingModel_Proto_Property_Location_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_ThingModel_Proto_Property_String_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_ThingModel_Proto_Property_String_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_ThingModel_Proto_PropertyType_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_ThingModel_Proto_PropertyType_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_ThingModel_Proto_StringDeclaration_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_ThingModel_Proto_StringDeclaration_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_ThingModel_Proto_Thing_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_ThingModel_Proto_Thing_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_ThingModel_Proto_ThingType_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_ThingModel_Proto_ThingType_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_ThingModel_Proto_Transaction_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_ThingModel_Proto_Transaction_fieldAccessorTable;

  public static com.google.protobuf.Descriptors.FileDescriptor
      getDescriptor() {
    return descriptor;
  }
  private static com.google.protobuf.Descriptors.FileDescriptor
      descriptor;
  static {
    java.lang.String[] descriptorData = {
      "\n\rgeneral.proto\022\020ThingModel.Proto\"\300\004\n\010Pr" +
      "operty\022\022\n\nstring_key\030\001 \002(\005\0225\n\004type\030\002 \002(\016" +
      "2\037.ThingModel.Proto.Property.Type:\006STRIN" +
      "G\022;\n\016location_value\030\003 \001(\0132#.ThingModel.P" +
      "roto.Property.Location\0227\n\014string_value\030\004" +
      " \001(\0132!.ThingModel.Proto.Property.String\022" +
      "\024\n\014double_value\030\005 \001(\001\022\021\n\tint_value\030\006 \001(\005" +
      "\022\025\n\rboolean_value\030\007 \001(\010\022\026\n\016datetime_valu" +
      "e\030\010 \001(\003\032b\n\010Location\022\014\n\001x\030\001 \002(\001:\0010\022\014\n\001y\030\002" +
      " \002(\001:\0010\022\014\n\001z\030\003 \001(\001:\0010\022\025\n\rstring_system\030\004",
      " \001(\005\022\025\n\006z_null\030\005 \001(\010:\005false\0320\n\006String\022\r\n" +
      "\005value\030\001 \001(\t\022\027\n\014string_value\030\002 \001(\005:\0010\"\204\001" +
      "\n\004Type\022\022\n\016LOCATION_POINT\020\000\022\023\n\017LOCATION_L" +
      "ATLNG\020\001\022\027\n\023LOCATION_EQUATORIAL\020\002\022\n\n\006STRI" +
      "NG\020\003\022\n\n\006DOUBLE\020\004\022\007\n\003INT\020\005\022\013\n\007BOOLEAN\020\006\022\014" +
      "\n\010DATETIME\020\007\"\370\001\n\014PropertyType\022\022\n\nstring_" +
      "key\030\001 \002(\005\0229\n\004type\030\002 \002(\0162#.ThingModel.Pro" +
      "to.PropertyType.Type:\006STRING\022\026\n\010required" +
      "\030\003 \002(\010:\004true\022\023\n\013string_name\030\004 \001(\005\022\032\n\022str" +
      "ing_description\030\005 \001(\005\"P\n\004Type\022\014\n\010LOCATIO",
      "N\020\000\022\n\n\006STRING\020\001\022\n\n\006DOUBLE\020\002\022\007\n\003INT\020\003\022\013\n\007" +
      "BOOLEAN\020\004\022\014\n\010DATETIME\020\005\"/\n\021StringDeclara" +
      "tion\022\r\n\005value\030\001 \002(\t\022\013\n\003key\030\002 \002(\005\"\240\001\n\005Thi" +
      "ng\022\021\n\tstring_id\030\001 \002(\005\022\030\n\020string_type_nam" +
      "e\030\002 \002(\005\022.\n\nproperties\030\003 \003(\0132\032.ThingModel" +
      ".Proto.Property\022\027\n\013connections\030\004 \003(\005B\002\020\001" +
      "\022!\n\022connections_change\030\005 \001(\010:\005false\"p\n\tT" +
      "hingType\022\023\n\013string_name\030\001 \002(\005\022\032\n\022string_" +
      "description\030\002 \001(\005\0222\n\nproperties\030\003 \003(\0132\036." +
      "ThingModel.Proto.PropertyType\"\201\002\n\013Transa",
      "ction\022@\n\023string_declarations\030\001 \003(\0132#.Thi" +
      "ngModel.Proto.StringDeclaration\0224\n\023thing" +
      "s_publish_list\030\002 \003(\0132\027.ThingModel.Proto." +
      "Thing\022\036\n\022things_remove_list\030\003 \003(\005B\002\020\001\022@\n" +
      "\033thingtypes_declaration_list\030\004 \003(\0132\033.Thi" +
      "ngModel.Proto.ThingType\022\030\n\020string_sender" +
      "_id\030\005 \002(\005"
    };
    com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
      new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
        public com.google.protobuf.ExtensionRegistry assignDescriptors(
            com.google.protobuf.Descriptors.FileDescriptor root) {
          descriptor = root;
          internal_static_ThingModel_Proto_Property_descriptor =
            getDescriptor().getMessageTypes().get(0);
          internal_static_ThingModel_Proto_Property_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_ThingModel_Proto_Property_descriptor,
              new java.lang.String[] { "StringKey", "Type", "LocationValue", "StringValue", "DoubleValue", "IntValue", "BooleanValue", "DatetimeValue", });
          internal_static_ThingModel_Proto_Property_Location_descriptor =
            internal_static_ThingModel_Proto_Property_descriptor.getNestedTypes().get(0);
          internal_static_ThingModel_Proto_Property_Location_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_ThingModel_Proto_Property_Location_descriptor,
              new java.lang.String[] { "X", "Y", "Z", "StringSystem", "ZNull", });
          internal_static_ThingModel_Proto_Property_String_descriptor =
            internal_static_ThingModel_Proto_Property_descriptor.getNestedTypes().get(1);
          internal_static_ThingModel_Proto_Property_String_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_ThingModel_Proto_Property_String_descriptor,
              new java.lang.String[] { "Value", "StringValue", });
          internal_static_ThingModel_Proto_PropertyType_descriptor =
            getDescriptor().getMessageTypes().get(1);
          internal_static_ThingModel_Proto_PropertyType_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_ThingModel_Proto_PropertyType_descriptor,
              new java.lang.String[] { "StringKey", "Type", "Required", "StringName", "StringDescription", });
          internal_static_ThingModel_Proto_StringDeclaration_descriptor =
            getDescriptor().getMessageTypes().get(2);
          internal_static_ThingModel_Proto_StringDeclaration_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_ThingModel_Proto_StringDeclaration_descriptor,
              new java.lang.String[] { "Value", "Key", });
          internal_static_ThingModel_Proto_Thing_descriptor =
            getDescriptor().getMessageTypes().get(3);
          internal_static_ThingModel_Proto_Thing_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_ThingModel_Proto_Thing_descriptor,
              new java.lang.String[] { "StringId", "StringTypeName", "Properties", "Connections", "ConnectionsChange", });
          internal_static_ThingModel_Proto_ThingType_descriptor =
            getDescriptor().getMessageTypes().get(4);
          internal_static_ThingModel_Proto_ThingType_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_ThingModel_Proto_ThingType_descriptor,
              new java.lang.String[] { "StringName", "StringDescription", "Properties", });
          internal_static_ThingModel_Proto_Transaction_descriptor =
            getDescriptor().getMessageTypes().get(5);
          internal_static_ThingModel_Proto_Transaction_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_ThingModel_Proto_Transaction_descriptor,
              new java.lang.String[] { "StringDeclarations", "ThingsPublishList", "ThingsRemoveList", "ThingtypesDeclarationList", "StringSenderId", });
          return null;
        }
      };
    com.google.protobuf.Descriptors.FileDescriptor
      .internalBuildGeneratedFileFrom(descriptorData,
        new com.google.protobuf.Descriptors.FileDescriptor[] {
        }, assigner);
  }

  // @@protoc_insertion_point(outer_class_scope)
}
