All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.whispersystems.libsignal.state.StorageProtos Maven / Gradle / Ivy

There is a newer version: 2.8.1
Show newest version
// Generated by the protocol buffer compiler.  DO NOT EDIT!
// source: LocalStorageProtocol.proto

package org.whispersystems.libsignal.state;

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

    // optional uint32 sessionVersion = 1;
    /**
     * optional uint32 sessionVersion = 1;
     */
    boolean hasSessionVersion();
    /**
     * optional uint32 sessionVersion = 1;
     */
    int getSessionVersion();

    // optional bytes localIdentityPublic = 2;
    /**
     * optional bytes localIdentityPublic = 2;
     */
    boolean hasLocalIdentityPublic();
    /**
     * optional bytes localIdentityPublic = 2;
     */
    com.google.protobuf.ByteString getLocalIdentityPublic();

    // optional bytes remoteIdentityPublic = 3;
    /**
     * optional bytes remoteIdentityPublic = 3;
     */
    boolean hasRemoteIdentityPublic();
    /**
     * optional bytes remoteIdentityPublic = 3;
     */
    com.google.protobuf.ByteString getRemoteIdentityPublic();

    // optional bytes rootKey = 4;
    /**
     * optional bytes rootKey = 4;
     */
    boolean hasRootKey();
    /**
     * optional bytes rootKey = 4;
     */
    com.google.protobuf.ByteString getRootKey();

    // optional uint32 previousCounter = 5;
    /**
     * optional uint32 previousCounter = 5;
     */
    boolean hasPreviousCounter();
    /**
     * optional uint32 previousCounter = 5;
     */
    int getPreviousCounter();

    // optional .textsecure.SessionStructure.Chain senderChain = 6;
    /**
     * optional .textsecure.SessionStructure.Chain senderChain = 6;
     */
    boolean hasSenderChain();
    /**
     * optional .textsecure.SessionStructure.Chain senderChain = 6;
     */
    org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain getSenderChain();
    /**
     * optional .textsecure.SessionStructure.Chain senderChain = 6;
     */
    org.whispersystems.libsignal.state.StorageProtos.SessionStructure.ChainOrBuilder getSenderChainOrBuilder();

    // repeated .textsecure.SessionStructure.Chain receiverChains = 7;
    /**
     * repeated .textsecure.SessionStructure.Chain receiverChains = 7;
     */
    java.util.List 
        getReceiverChainsList();
    /**
     * repeated .textsecure.SessionStructure.Chain receiverChains = 7;
     */
    org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain getReceiverChains(int index);
    /**
     * repeated .textsecure.SessionStructure.Chain receiverChains = 7;
     */
    int getReceiverChainsCount();
    /**
     * repeated .textsecure.SessionStructure.Chain receiverChains = 7;
     */
    java.util.List 
        getReceiverChainsOrBuilderList();
    /**
     * repeated .textsecure.SessionStructure.Chain receiverChains = 7;
     */
    org.whispersystems.libsignal.state.StorageProtos.SessionStructure.ChainOrBuilder getReceiverChainsOrBuilder(
        int index);

    // optional .textsecure.SessionStructure.PendingKeyExchange pendingKeyExchange = 8;
    /**
     * optional .textsecure.SessionStructure.PendingKeyExchange pendingKeyExchange = 8;
     */
    boolean hasPendingKeyExchange();
    /**
     * optional .textsecure.SessionStructure.PendingKeyExchange pendingKeyExchange = 8;
     */
    org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange getPendingKeyExchange();
    /**
     * optional .textsecure.SessionStructure.PendingKeyExchange pendingKeyExchange = 8;
     */
    org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchangeOrBuilder getPendingKeyExchangeOrBuilder();

    // optional .textsecure.SessionStructure.PendingPreKey pendingPreKey = 9;
    /**
     * optional .textsecure.SessionStructure.PendingPreKey pendingPreKey = 9;
     */
    boolean hasPendingPreKey();
    /**
     * optional .textsecure.SessionStructure.PendingPreKey pendingPreKey = 9;
     */
    org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey getPendingPreKey();
    /**
     * optional .textsecure.SessionStructure.PendingPreKey pendingPreKey = 9;
     */
    org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKeyOrBuilder getPendingPreKeyOrBuilder();

    // optional uint32 remoteRegistrationId = 10;
    /**
     * optional uint32 remoteRegistrationId = 10;
     */
    boolean hasRemoteRegistrationId();
    /**
     * optional uint32 remoteRegistrationId = 10;
     */
    int getRemoteRegistrationId();

    // optional uint32 localRegistrationId = 11;
    /**
     * optional uint32 localRegistrationId = 11;
     */
    boolean hasLocalRegistrationId();
    /**
     * optional uint32 localRegistrationId = 11;
     */
    int getLocalRegistrationId();

    // optional bool needsRefresh = 12;
    /**
     * optional bool needsRefresh = 12;
     */
    boolean hasNeedsRefresh();
    /**
     * optional bool needsRefresh = 12;
     */
    boolean getNeedsRefresh();

    // optional bytes aliceBaseKey = 13;
    /**
     * optional bytes aliceBaseKey = 13;
     */
    boolean hasAliceBaseKey();
    /**
     * optional bytes aliceBaseKey = 13;
     */
    com.google.protobuf.ByteString getAliceBaseKey();
  }
  /**
   * Protobuf type {@code textsecure.SessionStructure}
   */
  public static final class SessionStructure extends
      com.google.protobuf.GeneratedMessage
      implements SessionStructureOrBuilder {
    // Use SessionStructure.newBuilder() to construct.
    private SessionStructure(com.google.protobuf.GeneratedMessage.Builder builder) {
      super(builder);
      this.unknownFields = builder.getUnknownFields();
    }
    private SessionStructure(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

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

    public SessionStructure getDefaultInstanceForType() {
      return defaultInstance;
    }

    private final com.google.protobuf.UnknownFieldSet unknownFields;
    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
      return this.unknownFields;
    }
    private SessionStructure(
        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;
              sessionVersion_ = input.readUInt32();
              break;
            }
            case 18: {
              bitField0_ |= 0x00000002;
              localIdentityPublic_ = input.readBytes();
              break;
            }
            case 26: {
              bitField0_ |= 0x00000004;
              remoteIdentityPublic_ = input.readBytes();
              break;
            }
            case 34: {
              bitField0_ |= 0x00000008;
              rootKey_ = input.readBytes();
              break;
            }
            case 40: {
              bitField0_ |= 0x00000010;
              previousCounter_ = input.readUInt32();
              break;
            }
            case 50: {
              org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.Builder subBuilder = null;
              if (((bitField0_ & 0x00000020) == 0x00000020)) {
                subBuilder = senderChain_.toBuilder();
              }
              senderChain_ = input.readMessage(org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(senderChain_);
                senderChain_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000020;
              break;
            }
            case 58: {
              if (!((mutable_bitField0_ & 0x00000040) == 0x00000040)) {
                receiverChains_ = new java.util.ArrayList();
                mutable_bitField0_ |= 0x00000040;
              }
              receiverChains_.add(input.readMessage(org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.PARSER, extensionRegistry));
              break;
            }
            case 66: {
              org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange.Builder subBuilder = null;
              if (((bitField0_ & 0x00000040) == 0x00000040)) {
                subBuilder = pendingKeyExchange_.toBuilder();
              }
              pendingKeyExchange_ = input.readMessage(org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(pendingKeyExchange_);
                pendingKeyExchange_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000040;
              break;
            }
            case 74: {
              org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey.Builder subBuilder = null;
              if (((bitField0_ & 0x00000080) == 0x00000080)) {
                subBuilder = pendingPreKey_.toBuilder();
              }
              pendingPreKey_ = input.readMessage(org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(pendingPreKey_);
                pendingPreKey_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000080;
              break;
            }
            case 80: {
              bitField0_ |= 0x00000100;
              remoteRegistrationId_ = input.readUInt32();
              break;
            }
            case 88: {
              bitField0_ |= 0x00000200;
              localRegistrationId_ = input.readUInt32();
              break;
            }
            case 96: {
              bitField0_ |= 0x00000400;
              needsRefresh_ = input.readBool();
              break;
            }
            case 106: {
              bitField0_ |= 0x00000800;
              aliceBaseKey_ = input.readBytes();
              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_ & 0x00000040) == 0x00000040)) {
          receiverChains_ = java.util.Collections.unmodifiableList(receiverChains_);
        }
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_descriptor;
    }

    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              org.whispersystems.libsignal.state.StorageProtos.SessionStructure.class, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Builder.class);
    }

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

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

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

      // optional bytes senderRatchetKey = 1;
      /**
       * optional bytes senderRatchetKey = 1;
       */
      boolean hasSenderRatchetKey();
      /**
       * optional bytes senderRatchetKey = 1;
       */
      com.google.protobuf.ByteString getSenderRatchetKey();

      // optional bytes senderRatchetKeyPrivate = 2;
      /**
       * optional bytes senderRatchetKeyPrivate = 2;
       */
      boolean hasSenderRatchetKeyPrivate();
      /**
       * optional bytes senderRatchetKeyPrivate = 2;
       */
      com.google.protobuf.ByteString getSenderRatchetKeyPrivate();

      // optional .textsecure.SessionStructure.Chain.ChainKey chainKey = 3;
      /**
       * optional .textsecure.SessionStructure.Chain.ChainKey chainKey = 3;
       */
      boolean hasChainKey();
      /**
       * optional .textsecure.SessionStructure.Chain.ChainKey chainKey = 3;
       */
      org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey getChainKey();
      /**
       * optional .textsecure.SessionStructure.Chain.ChainKey chainKey = 3;
       */
      org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKeyOrBuilder getChainKeyOrBuilder();

      // repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4;
      /**
       * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4;
       */
      java.util.List 
          getMessageKeysList();
      /**
       * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4;
       */
      org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey getMessageKeys(int index);
      /**
       * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4;
       */
      int getMessageKeysCount();
      /**
       * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4;
       */
      java.util.List 
          getMessageKeysOrBuilderList();
      /**
       * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4;
       */
      org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKeyOrBuilder getMessageKeysOrBuilder(
          int index);
    }
    /**
     * Protobuf type {@code textsecure.SessionStructure.Chain}
     */
    public static final class Chain extends
        com.google.protobuf.GeneratedMessage
        implements ChainOrBuilder {
      // Use Chain.newBuilder() to construct.
      private Chain(com.google.protobuf.GeneratedMessage.Builder builder) {
        super(builder);
        this.unknownFields = builder.getUnknownFields();
      }
      private Chain(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

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

      public Chain getDefaultInstanceForType() {
        return defaultInstance;
      }

      private final com.google.protobuf.UnknownFieldSet unknownFields;
      @java.lang.Override
      public final com.google.protobuf.UnknownFieldSet
          getUnknownFields() {
        return this.unknownFields;
      }
      private Chain(
          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;
                senderRatchetKey_ = input.readBytes();
                break;
              }
              case 18: {
                bitField0_ |= 0x00000002;
                senderRatchetKeyPrivate_ = input.readBytes();
                break;
              }
              case 26: {
                org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey.Builder subBuilder = null;
                if (((bitField0_ & 0x00000004) == 0x00000004)) {
                  subBuilder = chainKey_.toBuilder();
                }
                chainKey_ = input.readMessage(org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey.PARSER, extensionRegistry);
                if (subBuilder != null) {
                  subBuilder.mergeFrom(chainKey_);
                  chainKey_ = subBuilder.buildPartial();
                }
                bitField0_ |= 0x00000004;
                break;
              }
              case 34: {
                if (!((mutable_bitField0_ & 0x00000008) == 0x00000008)) {
                  messageKeys_ = new java.util.ArrayList();
                  mutable_bitField0_ |= 0x00000008;
                }
                messageKeys_.add(input.readMessage(org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey.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_ & 0x00000008) == 0x00000008)) {
            messageKeys_ = java.util.Collections.unmodifiableList(messageKeys_);
          }
          this.unknownFields = unknownFields.build();
          makeExtensionsImmutable();
        }
      }
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_Chain_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_Chain_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.class, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.Builder.class);
      }

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

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

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

        // optional uint32 index = 1;
        /**
         * optional uint32 index = 1;
         */
        boolean hasIndex();
        /**
         * optional uint32 index = 1;
         */
        int getIndex();

        // optional bytes key = 2;
        /**
         * optional bytes key = 2;
         */
        boolean hasKey();
        /**
         * optional bytes key = 2;
         */
        com.google.protobuf.ByteString getKey();
      }
      /**
       * Protobuf type {@code textsecure.SessionStructure.Chain.ChainKey}
       */
      public static final class ChainKey extends
          com.google.protobuf.GeneratedMessage
          implements ChainKeyOrBuilder {
        // Use ChainKey.newBuilder() to construct.
        private ChainKey(com.google.protobuf.GeneratedMessage.Builder builder) {
          super(builder);
          this.unknownFields = builder.getUnknownFields();
        }
        private ChainKey(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

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

        public ChainKey getDefaultInstanceForType() {
          return defaultInstance;
        }

        private final com.google.protobuf.UnknownFieldSet unknownFields;
        @java.lang.Override
        public final com.google.protobuf.UnknownFieldSet
            getUnknownFields() {
          return this.unknownFields;
        }
        private ChainKey(
            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;
                  index_ = input.readUInt32();
                  break;
                }
                case 18: {
                  bitField0_ |= 0x00000002;
                  key_ = input.readBytes();
                  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 org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_Chain_ChainKey_descriptor;
        }

        protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_Chain_ChainKey_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey.class, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey.Builder.class);
        }

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

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

        private int bitField0_;
        // optional uint32 index = 1;
        public static final int INDEX_FIELD_NUMBER = 1;
        private int index_;
        /**
         * optional uint32 index = 1;
         */
        public boolean hasIndex() {
          return ((bitField0_ & 0x00000001) == 0x00000001);
        }
        /**
         * optional uint32 index = 1;
         */
        public int getIndex() {
          return index_;
        }

        // optional bytes key = 2;
        public static final int KEY_FIELD_NUMBER = 2;
        private com.google.protobuf.ByteString key_;
        /**
         * optional bytes key = 2;
         */
        public boolean hasKey() {
          return ((bitField0_ & 0x00000002) == 0x00000002);
        }
        /**
         * optional bytes key = 2;
         */
        public com.google.protobuf.ByteString getKey() {
          return key_;
        }

        private void initFields() {
          index_ = 0;
          key_ = com.google.protobuf.ByteString.EMPTY;
        }
        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.writeUInt32(1, index_);
          }
          if (((bitField0_ & 0x00000002) == 0x00000002)) {
            output.writeBytes(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
              .computeUInt32Size(1, index_);
          }
          if (((bitField0_ & 0x00000002) == 0x00000002)) {
            size += com.google.protobuf.CodedOutputStream
              .computeBytesSize(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 org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey parseFrom(
            com.google.protobuf.ByteString data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey parseFrom(
            com.google.protobuf.ByteString data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey parseFrom(byte[] data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey parseFrom(
            byte[] data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey parseFrom(java.io.InputStream input)
            throws java.io.IOException {
          return PARSER.parseFrom(input);
        }
        public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey parseFrom(
            java.io.InputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          return PARSER.parseFrom(input, extensionRegistry);
        }
        public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey parseDelimitedFrom(java.io.InputStream input)
            throws java.io.IOException {
          return PARSER.parseDelimitedFrom(input);
        }
        public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey parseDelimitedFrom(
            java.io.InputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          return PARSER.parseDelimitedFrom(input, extensionRegistry);
        }
        public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey parseFrom(
            com.google.protobuf.CodedInputStream input)
            throws java.io.IOException {
          return PARSER.parseFrom(input);
        }
        public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey 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(org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey 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 textsecure.SessionStructure.Chain.ChainKey}
         */
        public static final class Builder extends
            com.google.protobuf.GeneratedMessage.Builder
           implements org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKeyOrBuilder {
          public static final com.google.protobuf.Descriptors.Descriptor
              getDescriptor() {
            return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_Chain_ChainKey_descriptor;
          }

          protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
              internalGetFieldAccessorTable() {
            return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_Chain_ChainKey_fieldAccessorTable
                .ensureFieldAccessorsInitialized(
                    org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey.class, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey.Builder.class);
          }

          // Construct using org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey.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();
            index_ = 0;
            bitField0_ = (bitField0_ & ~0x00000001);
            key_ = com.google.protobuf.ByteString.EMPTY;
            bitField0_ = (bitField0_ & ~0x00000002);
            return this;
          }

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

          public com.google.protobuf.Descriptors.Descriptor
              getDescriptorForType() {
            return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_Chain_ChainKey_descriptor;
          }

          public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey getDefaultInstanceForType() {
            return org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey.getDefaultInstance();
          }

          public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey build() {
            org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey result = buildPartial();
            if (!result.isInitialized()) {
              throw newUninitializedMessageException(result);
            }
            return result;
          }

          public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey buildPartial() {
            org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey result = new org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey(this);
            int from_bitField0_ = bitField0_;
            int to_bitField0_ = 0;
            if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
              to_bitField0_ |= 0x00000001;
            }
            result.index_ = index_;
            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 org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey) {
              return mergeFrom((org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey)other);
            } else {
              super.mergeFrom(other);
              return this;
            }
          }

          public Builder mergeFrom(org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey other) {
            if (other == org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey.getDefaultInstance()) return this;
            if (other.hasIndex()) {
              setIndex(other.getIndex());
            }
            if (other.hasKey()) {
              setKey(other.getKey());
            }
            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 {
            org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey parsedMessage = null;
            try {
              parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
              parsedMessage = (org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey) e.getUnfinishedMessage();
              throw e;
            } finally {
              if (parsedMessage != null) {
                mergeFrom(parsedMessage);
              }
            }
            return this;
          }
          private int bitField0_;

          // optional uint32 index = 1;
          private int index_ ;
          /**
           * optional uint32 index = 1;
           */
          public boolean hasIndex() {
            return ((bitField0_ & 0x00000001) == 0x00000001);
          }
          /**
           * optional uint32 index = 1;
           */
          public int getIndex() {
            return index_;
          }
          /**
           * optional uint32 index = 1;
           */
          public Builder setIndex(int value) {
            bitField0_ |= 0x00000001;
            index_ = value;
            onChanged();
            return this;
          }
          /**
           * optional uint32 index = 1;
           */
          public Builder clearIndex() {
            bitField0_ = (bitField0_ & ~0x00000001);
            index_ = 0;
            onChanged();
            return this;
          }

          // optional bytes key = 2;
          private com.google.protobuf.ByteString key_ = com.google.protobuf.ByteString.EMPTY;
          /**
           * optional bytes key = 2;
           */
          public boolean hasKey() {
            return ((bitField0_ & 0x00000002) == 0x00000002);
          }
          /**
           * optional bytes key = 2;
           */
          public com.google.protobuf.ByteString getKey() {
            return key_;
          }
          /**
           * optional bytes key = 2;
           */
          public Builder setKey(com.google.protobuf.ByteString value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
            key_ = value;
            onChanged();
            return this;
          }
          /**
           * optional bytes key = 2;
           */
          public Builder clearKey() {
            bitField0_ = (bitField0_ & ~0x00000002);
            key_ = getDefaultInstance().getKey();
            onChanged();
            return this;
          }

          // @@protoc_insertion_point(builder_scope:textsecure.SessionStructure.Chain.ChainKey)
        }

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

        // @@protoc_insertion_point(class_scope:textsecure.SessionStructure.Chain.ChainKey)
      }

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

        // optional uint32 index = 1;
        /**
         * optional uint32 index = 1;
         */
        boolean hasIndex();
        /**
         * optional uint32 index = 1;
         */
        int getIndex();

        // optional bytes cipherKey = 2;
        /**
         * optional bytes cipherKey = 2;
         */
        boolean hasCipherKey();
        /**
         * optional bytes cipherKey = 2;
         */
        com.google.protobuf.ByteString getCipherKey();

        // optional bytes macKey = 3;
        /**
         * optional bytes macKey = 3;
         */
        boolean hasMacKey();
        /**
         * optional bytes macKey = 3;
         */
        com.google.protobuf.ByteString getMacKey();

        // optional bytes iv = 4;
        /**
         * optional bytes iv = 4;
         */
        boolean hasIv();
        /**
         * optional bytes iv = 4;
         */
        com.google.protobuf.ByteString getIv();
      }
      /**
       * Protobuf type {@code textsecure.SessionStructure.Chain.MessageKey}
       */
      public static final class MessageKey extends
          com.google.protobuf.GeneratedMessage
          implements MessageKeyOrBuilder {
        // Use MessageKey.newBuilder() to construct.
        private MessageKey(com.google.protobuf.GeneratedMessage.Builder builder) {
          super(builder);
          this.unknownFields = builder.getUnknownFields();
        }
        private MessageKey(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

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

        public MessageKey getDefaultInstanceForType() {
          return defaultInstance;
        }

        private final com.google.protobuf.UnknownFieldSet unknownFields;
        @java.lang.Override
        public final com.google.protobuf.UnknownFieldSet
            getUnknownFields() {
          return this.unknownFields;
        }
        private MessageKey(
            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;
                  index_ = input.readUInt32();
                  break;
                }
                case 18: {
                  bitField0_ |= 0x00000002;
                  cipherKey_ = input.readBytes();
                  break;
                }
                case 26: {
                  bitField0_ |= 0x00000004;
                  macKey_ = input.readBytes();
                  break;
                }
                case 34: {
                  bitField0_ |= 0x00000008;
                  iv_ = input.readBytes();
                  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 org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_Chain_MessageKey_descriptor;
        }

        protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_Chain_MessageKey_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey.class, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey.Builder.class);
        }

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

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

        private int bitField0_;
        // optional uint32 index = 1;
        public static final int INDEX_FIELD_NUMBER = 1;
        private int index_;
        /**
         * optional uint32 index = 1;
         */
        public boolean hasIndex() {
          return ((bitField0_ & 0x00000001) == 0x00000001);
        }
        /**
         * optional uint32 index = 1;
         */
        public int getIndex() {
          return index_;
        }

        // optional bytes cipherKey = 2;
        public static final int CIPHERKEY_FIELD_NUMBER = 2;
        private com.google.protobuf.ByteString cipherKey_;
        /**
         * optional bytes cipherKey = 2;
         */
        public boolean hasCipherKey() {
          return ((bitField0_ & 0x00000002) == 0x00000002);
        }
        /**
         * optional bytes cipherKey = 2;
         */
        public com.google.protobuf.ByteString getCipherKey() {
          return cipherKey_;
        }

        // optional bytes macKey = 3;
        public static final int MACKEY_FIELD_NUMBER = 3;
        private com.google.protobuf.ByteString macKey_;
        /**
         * optional bytes macKey = 3;
         */
        public boolean hasMacKey() {
          return ((bitField0_ & 0x00000004) == 0x00000004);
        }
        /**
         * optional bytes macKey = 3;
         */
        public com.google.protobuf.ByteString getMacKey() {
          return macKey_;
        }

        // optional bytes iv = 4;
        public static final int IV_FIELD_NUMBER = 4;
        private com.google.protobuf.ByteString iv_;
        /**
         * optional bytes iv = 4;
         */
        public boolean hasIv() {
          return ((bitField0_ & 0x00000008) == 0x00000008);
        }
        /**
         * optional bytes iv = 4;
         */
        public com.google.protobuf.ByteString getIv() {
          return iv_;
        }

        private void initFields() {
          index_ = 0;
          cipherKey_ = com.google.protobuf.ByteString.EMPTY;
          macKey_ = com.google.protobuf.ByteString.EMPTY;
          iv_ = com.google.protobuf.ByteString.EMPTY;
        }
        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.writeUInt32(1, index_);
          }
          if (((bitField0_ & 0x00000002) == 0x00000002)) {
            output.writeBytes(2, cipherKey_);
          }
          if (((bitField0_ & 0x00000004) == 0x00000004)) {
            output.writeBytes(3, macKey_);
          }
          if (((bitField0_ & 0x00000008) == 0x00000008)) {
            output.writeBytes(4, iv_);
          }
          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
              .computeUInt32Size(1, index_);
          }
          if (((bitField0_ & 0x00000002) == 0x00000002)) {
            size += com.google.protobuf.CodedOutputStream
              .computeBytesSize(2, cipherKey_);
          }
          if (((bitField0_ & 0x00000004) == 0x00000004)) {
            size += com.google.protobuf.CodedOutputStream
              .computeBytesSize(3, macKey_);
          }
          if (((bitField0_ & 0x00000008) == 0x00000008)) {
            size += com.google.protobuf.CodedOutputStream
              .computeBytesSize(4, iv_);
          }
          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 org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey parseFrom(
            com.google.protobuf.ByteString data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey parseFrom(
            com.google.protobuf.ByteString data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey parseFrom(byte[] data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey parseFrom(
            byte[] data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey parseFrom(java.io.InputStream input)
            throws java.io.IOException {
          return PARSER.parseFrom(input);
        }
        public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey parseFrom(
            java.io.InputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          return PARSER.parseFrom(input, extensionRegistry);
        }
        public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey parseDelimitedFrom(java.io.InputStream input)
            throws java.io.IOException {
          return PARSER.parseDelimitedFrom(input);
        }
        public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey parseDelimitedFrom(
            java.io.InputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          return PARSER.parseDelimitedFrom(input, extensionRegistry);
        }
        public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey parseFrom(
            com.google.protobuf.CodedInputStream input)
            throws java.io.IOException {
          return PARSER.parseFrom(input);
        }
        public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey 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(org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey 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 textsecure.SessionStructure.Chain.MessageKey}
         */
        public static final class Builder extends
            com.google.protobuf.GeneratedMessage.Builder
           implements org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKeyOrBuilder {
          public static final com.google.protobuf.Descriptors.Descriptor
              getDescriptor() {
            return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_Chain_MessageKey_descriptor;
          }

          protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
              internalGetFieldAccessorTable() {
            return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_Chain_MessageKey_fieldAccessorTable
                .ensureFieldAccessorsInitialized(
                    org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey.class, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey.Builder.class);
          }

          // Construct using org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey.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();
            index_ = 0;
            bitField0_ = (bitField0_ & ~0x00000001);
            cipherKey_ = com.google.protobuf.ByteString.EMPTY;
            bitField0_ = (bitField0_ & ~0x00000002);
            macKey_ = com.google.protobuf.ByteString.EMPTY;
            bitField0_ = (bitField0_ & ~0x00000004);
            iv_ = com.google.protobuf.ByteString.EMPTY;
            bitField0_ = (bitField0_ & ~0x00000008);
            return this;
          }

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

          public com.google.protobuf.Descriptors.Descriptor
              getDescriptorForType() {
            return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_Chain_MessageKey_descriptor;
          }

          public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey getDefaultInstanceForType() {
            return org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey.getDefaultInstance();
          }

          public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey build() {
            org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey result = buildPartial();
            if (!result.isInitialized()) {
              throw newUninitializedMessageException(result);
            }
            return result;
          }

          public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey buildPartial() {
            org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey result = new org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey(this);
            int from_bitField0_ = bitField0_;
            int to_bitField0_ = 0;
            if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
              to_bitField0_ |= 0x00000001;
            }
            result.index_ = index_;
            if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
              to_bitField0_ |= 0x00000002;
            }
            result.cipherKey_ = cipherKey_;
            if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
              to_bitField0_ |= 0x00000004;
            }
            result.macKey_ = macKey_;
            if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
              to_bitField0_ |= 0x00000008;
            }
            result.iv_ = iv_;
            result.bitField0_ = to_bitField0_;
            onBuilt();
            return result;
          }

          public Builder mergeFrom(com.google.protobuf.Message other) {
            if (other instanceof org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey) {
              return mergeFrom((org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey)other);
            } else {
              super.mergeFrom(other);
              return this;
            }
          }

          public Builder mergeFrom(org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey other) {
            if (other == org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey.getDefaultInstance()) return this;
            if (other.hasIndex()) {
              setIndex(other.getIndex());
            }
            if (other.hasCipherKey()) {
              setCipherKey(other.getCipherKey());
            }
            if (other.hasMacKey()) {
              setMacKey(other.getMacKey());
            }
            if (other.hasIv()) {
              setIv(other.getIv());
            }
            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 {
            org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey parsedMessage = null;
            try {
              parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
              parsedMessage = (org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey) e.getUnfinishedMessage();
              throw e;
            } finally {
              if (parsedMessage != null) {
                mergeFrom(parsedMessage);
              }
            }
            return this;
          }
          private int bitField0_;

          // optional uint32 index = 1;
          private int index_ ;
          /**
           * optional uint32 index = 1;
           */
          public boolean hasIndex() {
            return ((bitField0_ & 0x00000001) == 0x00000001);
          }
          /**
           * optional uint32 index = 1;
           */
          public int getIndex() {
            return index_;
          }
          /**
           * optional uint32 index = 1;
           */
          public Builder setIndex(int value) {
            bitField0_ |= 0x00000001;
            index_ = value;
            onChanged();
            return this;
          }
          /**
           * optional uint32 index = 1;
           */
          public Builder clearIndex() {
            bitField0_ = (bitField0_ & ~0x00000001);
            index_ = 0;
            onChanged();
            return this;
          }

          // optional bytes cipherKey = 2;
          private com.google.protobuf.ByteString cipherKey_ = com.google.protobuf.ByteString.EMPTY;
          /**
           * optional bytes cipherKey = 2;
           */
          public boolean hasCipherKey() {
            return ((bitField0_ & 0x00000002) == 0x00000002);
          }
          /**
           * optional bytes cipherKey = 2;
           */
          public com.google.protobuf.ByteString getCipherKey() {
            return cipherKey_;
          }
          /**
           * optional bytes cipherKey = 2;
           */
          public Builder setCipherKey(com.google.protobuf.ByteString value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
            cipherKey_ = value;
            onChanged();
            return this;
          }
          /**
           * optional bytes cipherKey = 2;
           */
          public Builder clearCipherKey() {
            bitField0_ = (bitField0_ & ~0x00000002);
            cipherKey_ = getDefaultInstance().getCipherKey();
            onChanged();
            return this;
          }

          // optional bytes macKey = 3;
          private com.google.protobuf.ByteString macKey_ = com.google.protobuf.ByteString.EMPTY;
          /**
           * optional bytes macKey = 3;
           */
          public boolean hasMacKey() {
            return ((bitField0_ & 0x00000004) == 0x00000004);
          }
          /**
           * optional bytes macKey = 3;
           */
          public com.google.protobuf.ByteString getMacKey() {
            return macKey_;
          }
          /**
           * optional bytes macKey = 3;
           */
          public Builder setMacKey(com.google.protobuf.ByteString value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
            macKey_ = value;
            onChanged();
            return this;
          }
          /**
           * optional bytes macKey = 3;
           */
          public Builder clearMacKey() {
            bitField0_ = (bitField0_ & ~0x00000004);
            macKey_ = getDefaultInstance().getMacKey();
            onChanged();
            return this;
          }

          // optional bytes iv = 4;
          private com.google.protobuf.ByteString iv_ = com.google.protobuf.ByteString.EMPTY;
          /**
           * optional bytes iv = 4;
           */
          public boolean hasIv() {
            return ((bitField0_ & 0x00000008) == 0x00000008);
          }
          /**
           * optional bytes iv = 4;
           */
          public com.google.protobuf.ByteString getIv() {
            return iv_;
          }
          /**
           * optional bytes iv = 4;
           */
          public Builder setIv(com.google.protobuf.ByteString value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
            iv_ = value;
            onChanged();
            return this;
          }
          /**
           * optional bytes iv = 4;
           */
          public Builder clearIv() {
            bitField0_ = (bitField0_ & ~0x00000008);
            iv_ = getDefaultInstance().getIv();
            onChanged();
            return this;
          }

          // @@protoc_insertion_point(builder_scope:textsecure.SessionStructure.Chain.MessageKey)
        }

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

        // @@protoc_insertion_point(class_scope:textsecure.SessionStructure.Chain.MessageKey)
      }

      private int bitField0_;
      // optional bytes senderRatchetKey = 1;
      public static final int SENDERRATCHETKEY_FIELD_NUMBER = 1;
      private com.google.protobuf.ByteString senderRatchetKey_;
      /**
       * optional bytes senderRatchetKey = 1;
       */
      public boolean hasSenderRatchetKey() {
        return ((bitField0_ & 0x00000001) == 0x00000001);
      }
      /**
       * optional bytes senderRatchetKey = 1;
       */
      public com.google.protobuf.ByteString getSenderRatchetKey() {
        return senderRatchetKey_;
      }

      // optional bytes senderRatchetKeyPrivate = 2;
      public static final int SENDERRATCHETKEYPRIVATE_FIELD_NUMBER = 2;
      private com.google.protobuf.ByteString senderRatchetKeyPrivate_;
      /**
       * optional bytes senderRatchetKeyPrivate = 2;
       */
      public boolean hasSenderRatchetKeyPrivate() {
        return ((bitField0_ & 0x00000002) == 0x00000002);
      }
      /**
       * optional bytes senderRatchetKeyPrivate = 2;
       */
      public com.google.protobuf.ByteString getSenderRatchetKeyPrivate() {
        return senderRatchetKeyPrivate_;
      }

      // optional .textsecure.SessionStructure.Chain.ChainKey chainKey = 3;
      public static final int CHAINKEY_FIELD_NUMBER = 3;
      private org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey chainKey_;
      /**
       * optional .textsecure.SessionStructure.Chain.ChainKey chainKey = 3;
       */
      public boolean hasChainKey() {
        return ((bitField0_ & 0x00000004) == 0x00000004);
      }
      /**
       * optional .textsecure.SessionStructure.Chain.ChainKey chainKey = 3;
       */
      public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey getChainKey() {
        return chainKey_;
      }
      /**
       * optional .textsecure.SessionStructure.Chain.ChainKey chainKey = 3;
       */
      public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKeyOrBuilder getChainKeyOrBuilder() {
        return chainKey_;
      }

      // repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4;
      public static final int MESSAGEKEYS_FIELD_NUMBER = 4;
      private java.util.List messageKeys_;
      /**
       * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4;
       */
      public java.util.List getMessageKeysList() {
        return messageKeys_;
      }
      /**
       * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4;
       */
      public java.util.List 
          getMessageKeysOrBuilderList() {
        return messageKeys_;
      }
      /**
       * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4;
       */
      public int getMessageKeysCount() {
        return messageKeys_.size();
      }
      /**
       * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4;
       */
      public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey getMessageKeys(int index) {
        return messageKeys_.get(index);
      }
      /**
       * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4;
       */
      public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKeyOrBuilder getMessageKeysOrBuilder(
          int index) {
        return messageKeys_.get(index);
      }

      private void initFields() {
        senderRatchetKey_ = com.google.protobuf.ByteString.EMPTY;
        senderRatchetKeyPrivate_ = com.google.protobuf.ByteString.EMPTY;
        chainKey_ = org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey.getDefaultInstance();
        messageKeys_ = java.util.Collections.emptyList();
      }
      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, senderRatchetKey_);
        }
        if (((bitField0_ & 0x00000002) == 0x00000002)) {
          output.writeBytes(2, senderRatchetKeyPrivate_);
        }
        if (((bitField0_ & 0x00000004) == 0x00000004)) {
          output.writeMessage(3, chainKey_);
        }
        for (int i = 0; i < messageKeys_.size(); i++) {
          output.writeMessage(4, messageKeys_.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
            .computeBytesSize(1, senderRatchetKey_);
        }
        if (((bitField0_ & 0x00000002) == 0x00000002)) {
          size += com.google.protobuf.CodedOutputStream
            .computeBytesSize(2, senderRatchetKeyPrivate_);
        }
        if (((bitField0_ & 0x00000004) == 0x00000004)) {
          size += com.google.protobuf.CodedOutputStream
            .computeMessageSize(3, chainKey_);
        }
        for (int i = 0; i < messageKeys_.size(); i++) {
          size += com.google.protobuf.CodedOutputStream
            .computeMessageSize(4, messageKeys_.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 org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain parseFrom(
          com.google.protobuf.ByteString data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain parseFrom(
          com.google.protobuf.ByteString data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain parseFrom(byte[] data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain parseFrom(
          byte[] data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain parseFrom(java.io.InputStream input)
          throws java.io.IOException {
        return PARSER.parseFrom(input);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain parseFrom(
          java.io.InputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        return PARSER.parseFrom(input, extensionRegistry);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain parseDelimitedFrom(java.io.InputStream input)
          throws java.io.IOException {
        return PARSER.parseDelimitedFrom(input);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain parseDelimitedFrom(
          java.io.InputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        return PARSER.parseDelimitedFrom(input, extensionRegistry);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain parseFrom(
          com.google.protobuf.CodedInputStream input)
          throws java.io.IOException {
        return PARSER.parseFrom(input);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain 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(org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain 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 textsecure.SessionStructure.Chain}
       */
      public static final class Builder extends
          com.google.protobuf.GeneratedMessage.Builder
         implements org.whispersystems.libsignal.state.StorageProtos.SessionStructure.ChainOrBuilder {
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_Chain_descriptor;
        }

        protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_Chain_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.class, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.Builder.class);
        }

        // Construct using org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.newBuilder()
        private Builder() {
          maybeForceBuilderInitialization();
        }

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

        public Builder clear() {
          super.clear();
          senderRatchetKey_ = com.google.protobuf.ByteString.EMPTY;
          bitField0_ = (bitField0_ & ~0x00000001);
          senderRatchetKeyPrivate_ = com.google.protobuf.ByteString.EMPTY;
          bitField0_ = (bitField0_ & ~0x00000002);
          if (chainKeyBuilder_ == null) {
            chainKey_ = org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey.getDefaultInstance();
          } else {
            chainKeyBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x00000004);
          if (messageKeysBuilder_ == null) {
            messageKeys_ = java.util.Collections.emptyList();
            bitField0_ = (bitField0_ & ~0x00000008);
          } else {
            messageKeysBuilder_.clear();
          }
          return this;
        }

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

        public com.google.protobuf.Descriptors.Descriptor
            getDescriptorForType() {
          return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_Chain_descriptor;
        }

        public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain getDefaultInstanceForType() {
          return org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.getDefaultInstance();
        }

        public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain build() {
          org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain result = buildPartial();
          if (!result.isInitialized()) {
            throw newUninitializedMessageException(result);
          }
          return result;
        }

        public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain buildPartial() {
          org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain result = new org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain(this);
          int from_bitField0_ = bitField0_;
          int to_bitField0_ = 0;
          if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
            to_bitField0_ |= 0x00000001;
          }
          result.senderRatchetKey_ = senderRatchetKey_;
          if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
            to_bitField0_ |= 0x00000002;
          }
          result.senderRatchetKeyPrivate_ = senderRatchetKeyPrivate_;
          if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
            to_bitField0_ |= 0x00000004;
          }
          if (chainKeyBuilder_ == null) {
            result.chainKey_ = chainKey_;
          } else {
            result.chainKey_ = chainKeyBuilder_.build();
          }
          if (messageKeysBuilder_ == null) {
            if (((bitField0_ & 0x00000008) == 0x00000008)) {
              messageKeys_ = java.util.Collections.unmodifiableList(messageKeys_);
              bitField0_ = (bitField0_ & ~0x00000008);
            }
            result.messageKeys_ = messageKeys_;
          } else {
            result.messageKeys_ = messageKeysBuilder_.build();
          }
          result.bitField0_ = to_bitField0_;
          onBuilt();
          return result;
        }

        public Builder mergeFrom(com.google.protobuf.Message other) {
          if (other instanceof org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain) {
            return mergeFrom((org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain)other);
          } else {
            super.mergeFrom(other);
            return this;
          }
        }

        public Builder mergeFrom(org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain other) {
          if (other == org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.getDefaultInstance()) return this;
          if (other.hasSenderRatchetKey()) {
            setSenderRatchetKey(other.getSenderRatchetKey());
          }
          if (other.hasSenderRatchetKeyPrivate()) {
            setSenderRatchetKeyPrivate(other.getSenderRatchetKeyPrivate());
          }
          if (other.hasChainKey()) {
            mergeChainKey(other.getChainKey());
          }
          if (messageKeysBuilder_ == null) {
            if (!other.messageKeys_.isEmpty()) {
              if (messageKeys_.isEmpty()) {
                messageKeys_ = other.messageKeys_;
                bitField0_ = (bitField0_ & ~0x00000008);
              } else {
                ensureMessageKeysIsMutable();
                messageKeys_.addAll(other.messageKeys_);
              }
              onChanged();
            }
          } else {
            if (!other.messageKeys_.isEmpty()) {
              if (messageKeysBuilder_.isEmpty()) {
                messageKeysBuilder_.dispose();
                messageKeysBuilder_ = null;
                messageKeys_ = other.messageKeys_;
                bitField0_ = (bitField0_ & ~0x00000008);
                messageKeysBuilder_ = 
                  com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
                     getMessageKeysFieldBuilder() : null;
              } else {
                messageKeysBuilder_.addAllMessages(other.messageKeys_);
              }
            }
          }
          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 {
          org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain parsedMessage = null;
          try {
            parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            parsedMessage = (org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain) e.getUnfinishedMessage();
            throw e;
          } finally {
            if (parsedMessage != null) {
              mergeFrom(parsedMessage);
            }
          }
          return this;
        }
        private int bitField0_;

        // optional bytes senderRatchetKey = 1;
        private com.google.protobuf.ByteString senderRatchetKey_ = com.google.protobuf.ByteString.EMPTY;
        /**
         * optional bytes senderRatchetKey = 1;
         */
        public boolean hasSenderRatchetKey() {
          return ((bitField0_ & 0x00000001) == 0x00000001);
        }
        /**
         * optional bytes senderRatchetKey = 1;
         */
        public com.google.protobuf.ByteString getSenderRatchetKey() {
          return senderRatchetKey_;
        }
        /**
         * optional bytes senderRatchetKey = 1;
         */
        public Builder setSenderRatchetKey(com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
          senderRatchetKey_ = value;
          onChanged();
          return this;
        }
        /**
         * optional bytes senderRatchetKey = 1;
         */
        public Builder clearSenderRatchetKey() {
          bitField0_ = (bitField0_ & ~0x00000001);
          senderRatchetKey_ = getDefaultInstance().getSenderRatchetKey();
          onChanged();
          return this;
        }

        // optional bytes senderRatchetKeyPrivate = 2;
        private com.google.protobuf.ByteString senderRatchetKeyPrivate_ = com.google.protobuf.ByteString.EMPTY;
        /**
         * optional bytes senderRatchetKeyPrivate = 2;
         */
        public boolean hasSenderRatchetKeyPrivate() {
          return ((bitField0_ & 0x00000002) == 0x00000002);
        }
        /**
         * optional bytes senderRatchetKeyPrivate = 2;
         */
        public com.google.protobuf.ByteString getSenderRatchetKeyPrivate() {
          return senderRatchetKeyPrivate_;
        }
        /**
         * optional bytes senderRatchetKeyPrivate = 2;
         */
        public Builder setSenderRatchetKeyPrivate(com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
          senderRatchetKeyPrivate_ = value;
          onChanged();
          return this;
        }
        /**
         * optional bytes senderRatchetKeyPrivate = 2;
         */
        public Builder clearSenderRatchetKeyPrivate() {
          bitField0_ = (bitField0_ & ~0x00000002);
          senderRatchetKeyPrivate_ = getDefaultInstance().getSenderRatchetKeyPrivate();
          onChanged();
          return this;
        }

        // optional .textsecure.SessionStructure.Chain.ChainKey chainKey = 3;
        private org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey chainKey_ = org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey.getDefaultInstance();
        private com.google.protobuf.SingleFieldBuilder<
            org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey.Builder, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKeyOrBuilder> chainKeyBuilder_;
        /**
         * optional .textsecure.SessionStructure.Chain.ChainKey chainKey = 3;
         */
        public boolean hasChainKey() {
          return ((bitField0_ & 0x00000004) == 0x00000004);
        }
        /**
         * optional .textsecure.SessionStructure.Chain.ChainKey chainKey = 3;
         */
        public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey getChainKey() {
          if (chainKeyBuilder_ == null) {
            return chainKey_;
          } else {
            return chainKeyBuilder_.getMessage();
          }
        }
        /**
         * optional .textsecure.SessionStructure.Chain.ChainKey chainKey = 3;
         */
        public Builder setChainKey(org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey value) {
          if (chainKeyBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            chainKey_ = value;
            onChanged();
          } else {
            chainKeyBuilder_.setMessage(value);
          }
          bitField0_ |= 0x00000004;
          return this;
        }
        /**
         * optional .textsecure.SessionStructure.Chain.ChainKey chainKey = 3;
         */
        public Builder setChainKey(
            org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey.Builder builderForValue) {
          if (chainKeyBuilder_ == null) {
            chainKey_ = builderForValue.build();
            onChanged();
          } else {
            chainKeyBuilder_.setMessage(builderForValue.build());
          }
          bitField0_ |= 0x00000004;
          return this;
        }
        /**
         * optional .textsecure.SessionStructure.Chain.ChainKey chainKey = 3;
         */
        public Builder mergeChainKey(org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey value) {
          if (chainKeyBuilder_ == null) {
            if (((bitField0_ & 0x00000004) == 0x00000004) &&
                chainKey_ != org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey.getDefaultInstance()) {
              chainKey_ =
                org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey.newBuilder(chainKey_).mergeFrom(value).buildPartial();
            } else {
              chainKey_ = value;
            }
            onChanged();
          } else {
            chainKeyBuilder_.mergeFrom(value);
          }
          bitField0_ |= 0x00000004;
          return this;
        }
        /**
         * optional .textsecure.SessionStructure.Chain.ChainKey chainKey = 3;
         */
        public Builder clearChainKey() {
          if (chainKeyBuilder_ == null) {
            chainKey_ = org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey.getDefaultInstance();
            onChanged();
          } else {
            chainKeyBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x00000004);
          return this;
        }
        /**
         * optional .textsecure.SessionStructure.Chain.ChainKey chainKey = 3;
         */
        public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey.Builder getChainKeyBuilder() {
          bitField0_ |= 0x00000004;
          onChanged();
          return getChainKeyFieldBuilder().getBuilder();
        }
        /**
         * optional .textsecure.SessionStructure.Chain.ChainKey chainKey = 3;
         */
        public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKeyOrBuilder getChainKeyOrBuilder() {
          if (chainKeyBuilder_ != null) {
            return chainKeyBuilder_.getMessageOrBuilder();
          } else {
            return chainKey_;
          }
        }
        /**
         * optional .textsecure.SessionStructure.Chain.ChainKey chainKey = 3;
         */
        private com.google.protobuf.SingleFieldBuilder<
            org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey.Builder, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKeyOrBuilder> 
            getChainKeyFieldBuilder() {
          if (chainKeyBuilder_ == null) {
            chainKeyBuilder_ = new com.google.protobuf.SingleFieldBuilder<
                org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey.Builder, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKeyOrBuilder>(
                    chainKey_,
                    getParentForChildren(),
                    isClean());
            chainKey_ = null;
          }
          return chainKeyBuilder_;
        }

        // repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4;
        private java.util.List messageKeys_ =
          java.util.Collections.emptyList();
        private void ensureMessageKeysIsMutable() {
          if (!((bitField0_ & 0x00000008) == 0x00000008)) {
            messageKeys_ = new java.util.ArrayList(messageKeys_);
            bitField0_ |= 0x00000008;
           }
        }

        private com.google.protobuf.RepeatedFieldBuilder<
            org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey.Builder, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKeyOrBuilder> messageKeysBuilder_;

        /**
         * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4;
         */
        public java.util.List getMessageKeysList() {
          if (messageKeysBuilder_ == null) {
            return java.util.Collections.unmodifiableList(messageKeys_);
          } else {
            return messageKeysBuilder_.getMessageList();
          }
        }
        /**
         * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4;
         */
        public int getMessageKeysCount() {
          if (messageKeysBuilder_ == null) {
            return messageKeys_.size();
          } else {
            return messageKeysBuilder_.getCount();
          }
        }
        /**
         * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4;
         */
        public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey getMessageKeys(int index) {
          if (messageKeysBuilder_ == null) {
            return messageKeys_.get(index);
          } else {
            return messageKeysBuilder_.getMessage(index);
          }
        }
        /**
         * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4;
         */
        public Builder setMessageKeys(
            int index, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey value) {
          if (messageKeysBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            ensureMessageKeysIsMutable();
            messageKeys_.set(index, value);
            onChanged();
          } else {
            messageKeysBuilder_.setMessage(index, value);
          }
          return this;
        }
        /**
         * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4;
         */
        public Builder setMessageKeys(
            int index, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey.Builder builderForValue) {
          if (messageKeysBuilder_ == null) {
            ensureMessageKeysIsMutable();
            messageKeys_.set(index, builderForValue.build());
            onChanged();
          } else {
            messageKeysBuilder_.setMessage(index, builderForValue.build());
          }
          return this;
        }
        /**
         * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4;
         */
        public Builder addMessageKeys(org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey value) {
          if (messageKeysBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            ensureMessageKeysIsMutable();
            messageKeys_.add(value);
            onChanged();
          } else {
            messageKeysBuilder_.addMessage(value);
          }
          return this;
        }
        /**
         * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4;
         */
        public Builder addMessageKeys(
            int index, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey value) {
          if (messageKeysBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            ensureMessageKeysIsMutable();
            messageKeys_.add(index, value);
            onChanged();
          } else {
            messageKeysBuilder_.addMessage(index, value);
          }
          return this;
        }
        /**
         * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4;
         */
        public Builder addMessageKeys(
            org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey.Builder builderForValue) {
          if (messageKeysBuilder_ == null) {
            ensureMessageKeysIsMutable();
            messageKeys_.add(builderForValue.build());
            onChanged();
          } else {
            messageKeysBuilder_.addMessage(builderForValue.build());
          }
          return this;
        }
        /**
         * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4;
         */
        public Builder addMessageKeys(
            int index, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey.Builder builderForValue) {
          if (messageKeysBuilder_ == null) {
            ensureMessageKeysIsMutable();
            messageKeys_.add(index, builderForValue.build());
            onChanged();
          } else {
            messageKeysBuilder_.addMessage(index, builderForValue.build());
          }
          return this;
        }
        /**
         * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4;
         */
        public Builder addAllMessageKeys(
            java.lang.Iterable values) {
          if (messageKeysBuilder_ == null) {
            ensureMessageKeysIsMutable();
            super.addAll(values, messageKeys_);
            onChanged();
          } else {
            messageKeysBuilder_.addAllMessages(values);
          }
          return this;
        }
        /**
         * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4;
         */
        public Builder clearMessageKeys() {
          if (messageKeysBuilder_ == null) {
            messageKeys_ = java.util.Collections.emptyList();
            bitField0_ = (bitField0_ & ~0x00000008);
            onChanged();
          } else {
            messageKeysBuilder_.clear();
          }
          return this;
        }
        /**
         * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4;
         */
        public Builder removeMessageKeys(int index) {
          if (messageKeysBuilder_ == null) {
            ensureMessageKeysIsMutable();
            messageKeys_.remove(index);
            onChanged();
          } else {
            messageKeysBuilder_.remove(index);
          }
          return this;
        }
        /**
         * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4;
         */
        public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey.Builder getMessageKeysBuilder(
            int index) {
          return getMessageKeysFieldBuilder().getBuilder(index);
        }
        /**
         * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4;
         */
        public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKeyOrBuilder getMessageKeysOrBuilder(
            int index) {
          if (messageKeysBuilder_ == null) {
            return messageKeys_.get(index);  } else {
            return messageKeysBuilder_.getMessageOrBuilder(index);
          }
        }
        /**
         * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4;
         */
        public java.util.List 
             getMessageKeysOrBuilderList() {
          if (messageKeysBuilder_ != null) {
            return messageKeysBuilder_.getMessageOrBuilderList();
          } else {
            return java.util.Collections.unmodifiableList(messageKeys_);
          }
        }
        /**
         * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4;
         */
        public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey.Builder addMessageKeysBuilder() {
          return getMessageKeysFieldBuilder().addBuilder(
              org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey.getDefaultInstance());
        }
        /**
         * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4;
         */
        public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey.Builder addMessageKeysBuilder(
            int index) {
          return getMessageKeysFieldBuilder().addBuilder(
              index, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey.getDefaultInstance());
        }
        /**
         * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4;
         */
        public java.util.List 
             getMessageKeysBuilderList() {
          return getMessageKeysFieldBuilder().getBuilderList();
        }
        private com.google.protobuf.RepeatedFieldBuilder<
            org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey.Builder, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKeyOrBuilder> 
            getMessageKeysFieldBuilder() {
          if (messageKeysBuilder_ == null) {
            messageKeysBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
                org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey.Builder, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKeyOrBuilder>(
                    messageKeys_,
                    ((bitField0_ & 0x00000008) == 0x00000008),
                    getParentForChildren(),
                    isClean());
            messageKeys_ = null;
          }
          return messageKeysBuilder_;
        }

        // @@protoc_insertion_point(builder_scope:textsecure.SessionStructure.Chain)
      }

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

      // @@protoc_insertion_point(class_scope:textsecure.SessionStructure.Chain)
    }

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

      // optional uint32 sequence = 1;
      /**
       * optional uint32 sequence = 1;
       */
      boolean hasSequence();
      /**
       * optional uint32 sequence = 1;
       */
      int getSequence();

      // optional bytes localBaseKey = 2;
      /**
       * optional bytes localBaseKey = 2;
       */
      boolean hasLocalBaseKey();
      /**
       * optional bytes localBaseKey = 2;
       */
      com.google.protobuf.ByteString getLocalBaseKey();

      // optional bytes localBaseKeyPrivate = 3;
      /**
       * optional bytes localBaseKeyPrivate = 3;
       */
      boolean hasLocalBaseKeyPrivate();
      /**
       * optional bytes localBaseKeyPrivate = 3;
       */
      com.google.protobuf.ByteString getLocalBaseKeyPrivate();

      // optional bytes localRatchetKey = 4;
      /**
       * optional bytes localRatchetKey = 4;
       */
      boolean hasLocalRatchetKey();
      /**
       * optional bytes localRatchetKey = 4;
       */
      com.google.protobuf.ByteString getLocalRatchetKey();

      // optional bytes localRatchetKeyPrivate = 5;
      /**
       * optional bytes localRatchetKeyPrivate = 5;
       */
      boolean hasLocalRatchetKeyPrivate();
      /**
       * optional bytes localRatchetKeyPrivate = 5;
       */
      com.google.protobuf.ByteString getLocalRatchetKeyPrivate();

      // optional bytes localIdentityKey = 7;
      /**
       * optional bytes localIdentityKey = 7;
       */
      boolean hasLocalIdentityKey();
      /**
       * optional bytes localIdentityKey = 7;
       */
      com.google.protobuf.ByteString getLocalIdentityKey();

      // optional bytes localIdentityKeyPrivate = 8;
      /**
       * optional bytes localIdentityKeyPrivate = 8;
       */
      boolean hasLocalIdentityKeyPrivate();
      /**
       * optional bytes localIdentityKeyPrivate = 8;
       */
      com.google.protobuf.ByteString getLocalIdentityKeyPrivate();
    }
    /**
     * Protobuf type {@code textsecure.SessionStructure.PendingKeyExchange}
     */
    public static final class PendingKeyExchange extends
        com.google.protobuf.GeneratedMessage
        implements PendingKeyExchangeOrBuilder {
      // Use PendingKeyExchange.newBuilder() to construct.
      private PendingKeyExchange(com.google.protobuf.GeneratedMessage.Builder builder) {
        super(builder);
        this.unknownFields = builder.getUnknownFields();
      }
      private PendingKeyExchange(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

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

      public PendingKeyExchange getDefaultInstanceForType() {
        return defaultInstance;
      }

      private final com.google.protobuf.UnknownFieldSet unknownFields;
      @java.lang.Override
      public final com.google.protobuf.UnknownFieldSet
          getUnknownFields() {
        return this.unknownFields;
      }
      private PendingKeyExchange(
          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;
                sequence_ = input.readUInt32();
                break;
              }
              case 18: {
                bitField0_ |= 0x00000002;
                localBaseKey_ = input.readBytes();
                break;
              }
              case 26: {
                bitField0_ |= 0x00000004;
                localBaseKeyPrivate_ = input.readBytes();
                break;
              }
              case 34: {
                bitField0_ |= 0x00000008;
                localRatchetKey_ = input.readBytes();
                break;
              }
              case 42: {
                bitField0_ |= 0x00000010;
                localRatchetKeyPrivate_ = input.readBytes();
                break;
              }
              case 58: {
                bitField0_ |= 0x00000020;
                localIdentityKey_ = input.readBytes();
                break;
              }
              case 66: {
                bitField0_ |= 0x00000040;
                localIdentityKeyPrivate_ = input.readBytes();
                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 org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_PendingKeyExchange_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_PendingKeyExchange_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange.class, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange.Builder.class);
      }

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

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

      private int bitField0_;
      // optional uint32 sequence = 1;
      public static final int SEQUENCE_FIELD_NUMBER = 1;
      private int sequence_;
      /**
       * optional uint32 sequence = 1;
       */
      public boolean hasSequence() {
        return ((bitField0_ & 0x00000001) == 0x00000001);
      }
      /**
       * optional uint32 sequence = 1;
       */
      public int getSequence() {
        return sequence_;
      }

      // optional bytes localBaseKey = 2;
      public static final int LOCALBASEKEY_FIELD_NUMBER = 2;
      private com.google.protobuf.ByteString localBaseKey_;
      /**
       * optional bytes localBaseKey = 2;
       */
      public boolean hasLocalBaseKey() {
        return ((bitField0_ & 0x00000002) == 0x00000002);
      }
      /**
       * optional bytes localBaseKey = 2;
       */
      public com.google.protobuf.ByteString getLocalBaseKey() {
        return localBaseKey_;
      }

      // optional bytes localBaseKeyPrivate = 3;
      public static final int LOCALBASEKEYPRIVATE_FIELD_NUMBER = 3;
      private com.google.protobuf.ByteString localBaseKeyPrivate_;
      /**
       * optional bytes localBaseKeyPrivate = 3;
       */
      public boolean hasLocalBaseKeyPrivate() {
        return ((bitField0_ & 0x00000004) == 0x00000004);
      }
      /**
       * optional bytes localBaseKeyPrivate = 3;
       */
      public com.google.protobuf.ByteString getLocalBaseKeyPrivate() {
        return localBaseKeyPrivate_;
      }

      // optional bytes localRatchetKey = 4;
      public static final int LOCALRATCHETKEY_FIELD_NUMBER = 4;
      private com.google.protobuf.ByteString localRatchetKey_;
      /**
       * optional bytes localRatchetKey = 4;
       */
      public boolean hasLocalRatchetKey() {
        return ((bitField0_ & 0x00000008) == 0x00000008);
      }
      /**
       * optional bytes localRatchetKey = 4;
       */
      public com.google.protobuf.ByteString getLocalRatchetKey() {
        return localRatchetKey_;
      }

      // optional bytes localRatchetKeyPrivate = 5;
      public static final int LOCALRATCHETKEYPRIVATE_FIELD_NUMBER = 5;
      private com.google.protobuf.ByteString localRatchetKeyPrivate_;
      /**
       * optional bytes localRatchetKeyPrivate = 5;
       */
      public boolean hasLocalRatchetKeyPrivate() {
        return ((bitField0_ & 0x00000010) == 0x00000010);
      }
      /**
       * optional bytes localRatchetKeyPrivate = 5;
       */
      public com.google.protobuf.ByteString getLocalRatchetKeyPrivate() {
        return localRatchetKeyPrivate_;
      }

      // optional bytes localIdentityKey = 7;
      public static final int LOCALIDENTITYKEY_FIELD_NUMBER = 7;
      private com.google.protobuf.ByteString localIdentityKey_;
      /**
       * optional bytes localIdentityKey = 7;
       */
      public boolean hasLocalIdentityKey() {
        return ((bitField0_ & 0x00000020) == 0x00000020);
      }
      /**
       * optional bytes localIdentityKey = 7;
       */
      public com.google.protobuf.ByteString getLocalIdentityKey() {
        return localIdentityKey_;
      }

      // optional bytes localIdentityKeyPrivate = 8;
      public static final int LOCALIDENTITYKEYPRIVATE_FIELD_NUMBER = 8;
      private com.google.protobuf.ByteString localIdentityKeyPrivate_;
      /**
       * optional bytes localIdentityKeyPrivate = 8;
       */
      public boolean hasLocalIdentityKeyPrivate() {
        return ((bitField0_ & 0x00000040) == 0x00000040);
      }
      /**
       * optional bytes localIdentityKeyPrivate = 8;
       */
      public com.google.protobuf.ByteString getLocalIdentityKeyPrivate() {
        return localIdentityKeyPrivate_;
      }

      private void initFields() {
        sequence_ = 0;
        localBaseKey_ = com.google.protobuf.ByteString.EMPTY;
        localBaseKeyPrivate_ = com.google.protobuf.ByteString.EMPTY;
        localRatchetKey_ = com.google.protobuf.ByteString.EMPTY;
        localRatchetKeyPrivate_ = com.google.protobuf.ByteString.EMPTY;
        localIdentityKey_ = com.google.protobuf.ByteString.EMPTY;
        localIdentityKeyPrivate_ = com.google.protobuf.ByteString.EMPTY;
      }
      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.writeUInt32(1, sequence_);
        }
        if (((bitField0_ & 0x00000002) == 0x00000002)) {
          output.writeBytes(2, localBaseKey_);
        }
        if (((bitField0_ & 0x00000004) == 0x00000004)) {
          output.writeBytes(3, localBaseKeyPrivate_);
        }
        if (((bitField0_ & 0x00000008) == 0x00000008)) {
          output.writeBytes(4, localRatchetKey_);
        }
        if (((bitField0_ & 0x00000010) == 0x00000010)) {
          output.writeBytes(5, localRatchetKeyPrivate_);
        }
        if (((bitField0_ & 0x00000020) == 0x00000020)) {
          output.writeBytes(7, localIdentityKey_);
        }
        if (((bitField0_ & 0x00000040) == 0x00000040)) {
          output.writeBytes(8, localIdentityKeyPrivate_);
        }
        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
            .computeUInt32Size(1, sequence_);
        }
        if (((bitField0_ & 0x00000002) == 0x00000002)) {
          size += com.google.protobuf.CodedOutputStream
            .computeBytesSize(2, localBaseKey_);
        }
        if (((bitField0_ & 0x00000004) == 0x00000004)) {
          size += com.google.protobuf.CodedOutputStream
            .computeBytesSize(3, localBaseKeyPrivate_);
        }
        if (((bitField0_ & 0x00000008) == 0x00000008)) {
          size += com.google.protobuf.CodedOutputStream
            .computeBytesSize(4, localRatchetKey_);
        }
        if (((bitField0_ & 0x00000010) == 0x00000010)) {
          size += com.google.protobuf.CodedOutputStream
            .computeBytesSize(5, localRatchetKeyPrivate_);
        }
        if (((bitField0_ & 0x00000020) == 0x00000020)) {
          size += com.google.protobuf.CodedOutputStream
            .computeBytesSize(7, localIdentityKey_);
        }
        if (((bitField0_ & 0x00000040) == 0x00000040)) {
          size += com.google.protobuf.CodedOutputStream
            .computeBytesSize(8, localIdentityKeyPrivate_);
        }
        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 org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange parseFrom(
          com.google.protobuf.ByteString data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange parseFrom(
          com.google.protobuf.ByteString data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange parseFrom(byte[] data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange parseFrom(
          byte[] data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange parseFrom(java.io.InputStream input)
          throws java.io.IOException {
        return PARSER.parseFrom(input);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange parseFrom(
          java.io.InputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        return PARSER.parseFrom(input, extensionRegistry);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange parseDelimitedFrom(java.io.InputStream input)
          throws java.io.IOException {
        return PARSER.parseDelimitedFrom(input);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange parseDelimitedFrom(
          java.io.InputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        return PARSER.parseDelimitedFrom(input, extensionRegistry);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange parseFrom(
          com.google.protobuf.CodedInputStream input)
          throws java.io.IOException {
        return PARSER.parseFrom(input);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange 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(org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange 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 textsecure.SessionStructure.PendingKeyExchange}
       */
      public static final class Builder extends
          com.google.protobuf.GeneratedMessage.Builder
         implements org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchangeOrBuilder {
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_PendingKeyExchange_descriptor;
        }

        protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_PendingKeyExchange_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange.class, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange.Builder.class);
        }

        // Construct using org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange.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();
          sequence_ = 0;
          bitField0_ = (bitField0_ & ~0x00000001);
          localBaseKey_ = com.google.protobuf.ByteString.EMPTY;
          bitField0_ = (bitField0_ & ~0x00000002);
          localBaseKeyPrivate_ = com.google.protobuf.ByteString.EMPTY;
          bitField0_ = (bitField0_ & ~0x00000004);
          localRatchetKey_ = com.google.protobuf.ByteString.EMPTY;
          bitField0_ = (bitField0_ & ~0x00000008);
          localRatchetKeyPrivate_ = com.google.protobuf.ByteString.EMPTY;
          bitField0_ = (bitField0_ & ~0x00000010);
          localIdentityKey_ = com.google.protobuf.ByteString.EMPTY;
          bitField0_ = (bitField0_ & ~0x00000020);
          localIdentityKeyPrivate_ = com.google.protobuf.ByteString.EMPTY;
          bitField0_ = (bitField0_ & ~0x00000040);
          return this;
        }

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

        public com.google.protobuf.Descriptors.Descriptor
            getDescriptorForType() {
          return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_PendingKeyExchange_descriptor;
        }

        public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange getDefaultInstanceForType() {
          return org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange.getDefaultInstance();
        }

        public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange build() {
          org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange result = buildPartial();
          if (!result.isInitialized()) {
            throw newUninitializedMessageException(result);
          }
          return result;
        }

        public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange buildPartial() {
          org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange result = new org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange(this);
          int from_bitField0_ = bitField0_;
          int to_bitField0_ = 0;
          if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
            to_bitField0_ |= 0x00000001;
          }
          result.sequence_ = sequence_;
          if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
            to_bitField0_ |= 0x00000002;
          }
          result.localBaseKey_ = localBaseKey_;
          if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
            to_bitField0_ |= 0x00000004;
          }
          result.localBaseKeyPrivate_ = localBaseKeyPrivate_;
          if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
            to_bitField0_ |= 0x00000008;
          }
          result.localRatchetKey_ = localRatchetKey_;
          if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
            to_bitField0_ |= 0x00000010;
          }
          result.localRatchetKeyPrivate_ = localRatchetKeyPrivate_;
          if (((from_bitField0_ & 0x00000020) == 0x00000020)) {
            to_bitField0_ |= 0x00000020;
          }
          result.localIdentityKey_ = localIdentityKey_;
          if (((from_bitField0_ & 0x00000040) == 0x00000040)) {
            to_bitField0_ |= 0x00000040;
          }
          result.localIdentityKeyPrivate_ = localIdentityKeyPrivate_;
          result.bitField0_ = to_bitField0_;
          onBuilt();
          return result;
        }

        public Builder mergeFrom(com.google.protobuf.Message other) {
          if (other instanceof org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange) {
            return mergeFrom((org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange)other);
          } else {
            super.mergeFrom(other);
            return this;
          }
        }

        public Builder mergeFrom(org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange other) {
          if (other == org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange.getDefaultInstance()) return this;
          if (other.hasSequence()) {
            setSequence(other.getSequence());
          }
          if (other.hasLocalBaseKey()) {
            setLocalBaseKey(other.getLocalBaseKey());
          }
          if (other.hasLocalBaseKeyPrivate()) {
            setLocalBaseKeyPrivate(other.getLocalBaseKeyPrivate());
          }
          if (other.hasLocalRatchetKey()) {
            setLocalRatchetKey(other.getLocalRatchetKey());
          }
          if (other.hasLocalRatchetKeyPrivate()) {
            setLocalRatchetKeyPrivate(other.getLocalRatchetKeyPrivate());
          }
          if (other.hasLocalIdentityKey()) {
            setLocalIdentityKey(other.getLocalIdentityKey());
          }
          if (other.hasLocalIdentityKeyPrivate()) {
            setLocalIdentityKeyPrivate(other.getLocalIdentityKeyPrivate());
          }
          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 {
          org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange parsedMessage = null;
          try {
            parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            parsedMessage = (org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange) e.getUnfinishedMessage();
            throw e;
          } finally {
            if (parsedMessage != null) {
              mergeFrom(parsedMessage);
            }
          }
          return this;
        }
        private int bitField0_;

        // optional uint32 sequence = 1;
        private int sequence_ ;
        /**
         * optional uint32 sequence = 1;
         */
        public boolean hasSequence() {
          return ((bitField0_ & 0x00000001) == 0x00000001);
        }
        /**
         * optional uint32 sequence = 1;
         */
        public int getSequence() {
          return sequence_;
        }
        /**
         * optional uint32 sequence = 1;
         */
        public Builder setSequence(int value) {
          bitField0_ |= 0x00000001;
          sequence_ = value;
          onChanged();
          return this;
        }
        /**
         * optional uint32 sequence = 1;
         */
        public Builder clearSequence() {
          bitField0_ = (bitField0_ & ~0x00000001);
          sequence_ = 0;
          onChanged();
          return this;
        }

        // optional bytes localBaseKey = 2;
        private com.google.protobuf.ByteString localBaseKey_ = com.google.protobuf.ByteString.EMPTY;
        /**
         * optional bytes localBaseKey = 2;
         */
        public boolean hasLocalBaseKey() {
          return ((bitField0_ & 0x00000002) == 0x00000002);
        }
        /**
         * optional bytes localBaseKey = 2;
         */
        public com.google.protobuf.ByteString getLocalBaseKey() {
          return localBaseKey_;
        }
        /**
         * optional bytes localBaseKey = 2;
         */
        public Builder setLocalBaseKey(com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
          localBaseKey_ = value;
          onChanged();
          return this;
        }
        /**
         * optional bytes localBaseKey = 2;
         */
        public Builder clearLocalBaseKey() {
          bitField0_ = (bitField0_ & ~0x00000002);
          localBaseKey_ = getDefaultInstance().getLocalBaseKey();
          onChanged();
          return this;
        }

        // optional bytes localBaseKeyPrivate = 3;
        private com.google.protobuf.ByteString localBaseKeyPrivate_ = com.google.protobuf.ByteString.EMPTY;
        /**
         * optional bytes localBaseKeyPrivate = 3;
         */
        public boolean hasLocalBaseKeyPrivate() {
          return ((bitField0_ & 0x00000004) == 0x00000004);
        }
        /**
         * optional bytes localBaseKeyPrivate = 3;
         */
        public com.google.protobuf.ByteString getLocalBaseKeyPrivate() {
          return localBaseKeyPrivate_;
        }
        /**
         * optional bytes localBaseKeyPrivate = 3;
         */
        public Builder setLocalBaseKeyPrivate(com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
          localBaseKeyPrivate_ = value;
          onChanged();
          return this;
        }
        /**
         * optional bytes localBaseKeyPrivate = 3;
         */
        public Builder clearLocalBaseKeyPrivate() {
          bitField0_ = (bitField0_ & ~0x00000004);
          localBaseKeyPrivate_ = getDefaultInstance().getLocalBaseKeyPrivate();
          onChanged();
          return this;
        }

        // optional bytes localRatchetKey = 4;
        private com.google.protobuf.ByteString localRatchetKey_ = com.google.protobuf.ByteString.EMPTY;
        /**
         * optional bytes localRatchetKey = 4;
         */
        public boolean hasLocalRatchetKey() {
          return ((bitField0_ & 0x00000008) == 0x00000008);
        }
        /**
         * optional bytes localRatchetKey = 4;
         */
        public com.google.protobuf.ByteString getLocalRatchetKey() {
          return localRatchetKey_;
        }
        /**
         * optional bytes localRatchetKey = 4;
         */
        public Builder setLocalRatchetKey(com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
          localRatchetKey_ = value;
          onChanged();
          return this;
        }
        /**
         * optional bytes localRatchetKey = 4;
         */
        public Builder clearLocalRatchetKey() {
          bitField0_ = (bitField0_ & ~0x00000008);
          localRatchetKey_ = getDefaultInstance().getLocalRatchetKey();
          onChanged();
          return this;
        }

        // optional bytes localRatchetKeyPrivate = 5;
        private com.google.protobuf.ByteString localRatchetKeyPrivate_ = com.google.protobuf.ByteString.EMPTY;
        /**
         * optional bytes localRatchetKeyPrivate = 5;
         */
        public boolean hasLocalRatchetKeyPrivate() {
          return ((bitField0_ & 0x00000010) == 0x00000010);
        }
        /**
         * optional bytes localRatchetKeyPrivate = 5;
         */
        public com.google.protobuf.ByteString getLocalRatchetKeyPrivate() {
          return localRatchetKeyPrivate_;
        }
        /**
         * optional bytes localRatchetKeyPrivate = 5;
         */
        public Builder setLocalRatchetKeyPrivate(com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
          localRatchetKeyPrivate_ = value;
          onChanged();
          return this;
        }
        /**
         * optional bytes localRatchetKeyPrivate = 5;
         */
        public Builder clearLocalRatchetKeyPrivate() {
          bitField0_ = (bitField0_ & ~0x00000010);
          localRatchetKeyPrivate_ = getDefaultInstance().getLocalRatchetKeyPrivate();
          onChanged();
          return this;
        }

        // optional bytes localIdentityKey = 7;
        private com.google.protobuf.ByteString localIdentityKey_ = com.google.protobuf.ByteString.EMPTY;
        /**
         * optional bytes localIdentityKey = 7;
         */
        public boolean hasLocalIdentityKey() {
          return ((bitField0_ & 0x00000020) == 0x00000020);
        }
        /**
         * optional bytes localIdentityKey = 7;
         */
        public com.google.protobuf.ByteString getLocalIdentityKey() {
          return localIdentityKey_;
        }
        /**
         * optional bytes localIdentityKey = 7;
         */
        public Builder setLocalIdentityKey(com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000020;
          localIdentityKey_ = value;
          onChanged();
          return this;
        }
        /**
         * optional bytes localIdentityKey = 7;
         */
        public Builder clearLocalIdentityKey() {
          bitField0_ = (bitField0_ & ~0x00000020);
          localIdentityKey_ = getDefaultInstance().getLocalIdentityKey();
          onChanged();
          return this;
        }

        // optional bytes localIdentityKeyPrivate = 8;
        private com.google.protobuf.ByteString localIdentityKeyPrivate_ = com.google.protobuf.ByteString.EMPTY;
        /**
         * optional bytes localIdentityKeyPrivate = 8;
         */
        public boolean hasLocalIdentityKeyPrivate() {
          return ((bitField0_ & 0x00000040) == 0x00000040);
        }
        /**
         * optional bytes localIdentityKeyPrivate = 8;
         */
        public com.google.protobuf.ByteString getLocalIdentityKeyPrivate() {
          return localIdentityKeyPrivate_;
        }
        /**
         * optional bytes localIdentityKeyPrivate = 8;
         */
        public Builder setLocalIdentityKeyPrivate(com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000040;
          localIdentityKeyPrivate_ = value;
          onChanged();
          return this;
        }
        /**
         * optional bytes localIdentityKeyPrivate = 8;
         */
        public Builder clearLocalIdentityKeyPrivate() {
          bitField0_ = (bitField0_ & ~0x00000040);
          localIdentityKeyPrivate_ = getDefaultInstance().getLocalIdentityKeyPrivate();
          onChanged();
          return this;
        }

        // @@protoc_insertion_point(builder_scope:textsecure.SessionStructure.PendingKeyExchange)
      }

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

      // @@protoc_insertion_point(class_scope:textsecure.SessionStructure.PendingKeyExchange)
    }

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

      // optional uint32 preKeyId = 1;
      /**
       * optional uint32 preKeyId = 1;
       */
      boolean hasPreKeyId();
      /**
       * optional uint32 preKeyId = 1;
       */
      int getPreKeyId();

      // optional int32 signedPreKeyId = 3;
      /**
       * optional int32 signedPreKeyId = 3;
       */
      boolean hasSignedPreKeyId();
      /**
       * optional int32 signedPreKeyId = 3;
       */
      int getSignedPreKeyId();

      // optional bytes baseKey = 2;
      /**
       * optional bytes baseKey = 2;
       */
      boolean hasBaseKey();
      /**
       * optional bytes baseKey = 2;
       */
      com.google.protobuf.ByteString getBaseKey();
    }
    /**
     * Protobuf type {@code textsecure.SessionStructure.PendingPreKey}
     */
    public static final class PendingPreKey extends
        com.google.protobuf.GeneratedMessage
        implements PendingPreKeyOrBuilder {
      // Use PendingPreKey.newBuilder() to construct.
      private PendingPreKey(com.google.protobuf.GeneratedMessage.Builder builder) {
        super(builder);
        this.unknownFields = builder.getUnknownFields();
      }
      private PendingPreKey(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

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

      public PendingPreKey getDefaultInstanceForType() {
        return defaultInstance;
      }

      private final com.google.protobuf.UnknownFieldSet unknownFields;
      @java.lang.Override
      public final com.google.protobuf.UnknownFieldSet
          getUnknownFields() {
        return this.unknownFields;
      }
      private PendingPreKey(
          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;
                preKeyId_ = input.readUInt32();
                break;
              }
              case 18: {
                bitField0_ |= 0x00000004;
                baseKey_ = input.readBytes();
                break;
              }
              case 24: {
                bitField0_ |= 0x00000002;
                signedPreKeyId_ = 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 org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_PendingPreKey_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_PendingPreKey_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey.class, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey.Builder.class);
      }

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

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

      private int bitField0_;
      // optional uint32 preKeyId = 1;
      public static final int PREKEYID_FIELD_NUMBER = 1;
      private int preKeyId_;
      /**
       * optional uint32 preKeyId = 1;
       */
      public boolean hasPreKeyId() {
        return ((bitField0_ & 0x00000001) == 0x00000001);
      }
      /**
       * optional uint32 preKeyId = 1;
       */
      public int getPreKeyId() {
        return preKeyId_;
      }

      // optional int32 signedPreKeyId = 3;
      public static final int SIGNEDPREKEYID_FIELD_NUMBER = 3;
      private int signedPreKeyId_;
      /**
       * optional int32 signedPreKeyId = 3;
       */
      public boolean hasSignedPreKeyId() {
        return ((bitField0_ & 0x00000002) == 0x00000002);
      }
      /**
       * optional int32 signedPreKeyId = 3;
       */
      public int getSignedPreKeyId() {
        return signedPreKeyId_;
      }

      // optional bytes baseKey = 2;
      public static final int BASEKEY_FIELD_NUMBER = 2;
      private com.google.protobuf.ByteString baseKey_;
      /**
       * optional bytes baseKey = 2;
       */
      public boolean hasBaseKey() {
        return ((bitField0_ & 0x00000004) == 0x00000004);
      }
      /**
       * optional bytes baseKey = 2;
       */
      public com.google.protobuf.ByteString getBaseKey() {
        return baseKey_;
      }

      private void initFields() {
        preKeyId_ = 0;
        signedPreKeyId_ = 0;
        baseKey_ = com.google.protobuf.ByteString.EMPTY;
      }
      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.writeUInt32(1, preKeyId_);
        }
        if (((bitField0_ & 0x00000004) == 0x00000004)) {
          output.writeBytes(2, baseKey_);
        }
        if (((bitField0_ & 0x00000002) == 0x00000002)) {
          output.writeInt32(3, signedPreKeyId_);
        }
        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
            .computeUInt32Size(1, preKeyId_);
        }
        if (((bitField0_ & 0x00000004) == 0x00000004)) {
          size += com.google.protobuf.CodedOutputStream
            .computeBytesSize(2, baseKey_);
        }
        if (((bitField0_ & 0x00000002) == 0x00000002)) {
          size += com.google.protobuf.CodedOutputStream
            .computeInt32Size(3, signedPreKeyId_);
        }
        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 org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey parseFrom(
          com.google.protobuf.ByteString data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey parseFrom(
          com.google.protobuf.ByteString data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey parseFrom(byte[] data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey parseFrom(
          byte[] data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey parseFrom(java.io.InputStream input)
          throws java.io.IOException {
        return PARSER.parseFrom(input);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey parseFrom(
          java.io.InputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        return PARSER.parseFrom(input, extensionRegistry);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey parseDelimitedFrom(java.io.InputStream input)
          throws java.io.IOException {
        return PARSER.parseDelimitedFrom(input);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey parseDelimitedFrom(
          java.io.InputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        return PARSER.parseDelimitedFrom(input, extensionRegistry);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey parseFrom(
          com.google.protobuf.CodedInputStream input)
          throws java.io.IOException {
        return PARSER.parseFrom(input);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey 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(org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey 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 textsecure.SessionStructure.PendingPreKey}
       */
      public static final class Builder extends
          com.google.protobuf.GeneratedMessage.Builder
         implements org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKeyOrBuilder {
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_PendingPreKey_descriptor;
        }

        protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_PendingPreKey_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey.class, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey.Builder.class);
        }

        // Construct using org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey.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();
          preKeyId_ = 0;
          bitField0_ = (bitField0_ & ~0x00000001);
          signedPreKeyId_ = 0;
          bitField0_ = (bitField0_ & ~0x00000002);
          baseKey_ = com.google.protobuf.ByteString.EMPTY;
          bitField0_ = (bitField0_ & ~0x00000004);
          return this;
        }

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

        public com.google.protobuf.Descriptors.Descriptor
            getDescriptorForType() {
          return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_PendingPreKey_descriptor;
        }

        public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey getDefaultInstanceForType() {
          return org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey.getDefaultInstance();
        }

        public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey build() {
          org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey result = buildPartial();
          if (!result.isInitialized()) {
            throw newUninitializedMessageException(result);
          }
          return result;
        }

        public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey buildPartial() {
          org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey result = new org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey(this);
          int from_bitField0_ = bitField0_;
          int to_bitField0_ = 0;
          if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
            to_bitField0_ |= 0x00000001;
          }
          result.preKeyId_ = preKeyId_;
          if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
            to_bitField0_ |= 0x00000002;
          }
          result.signedPreKeyId_ = signedPreKeyId_;
          if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
            to_bitField0_ |= 0x00000004;
          }
          result.baseKey_ = baseKey_;
          result.bitField0_ = to_bitField0_;
          onBuilt();
          return result;
        }

        public Builder mergeFrom(com.google.protobuf.Message other) {
          if (other instanceof org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey) {
            return mergeFrom((org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey)other);
          } else {
            super.mergeFrom(other);
            return this;
          }
        }

        public Builder mergeFrom(org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey other) {
          if (other == org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey.getDefaultInstance()) return this;
          if (other.hasPreKeyId()) {
            setPreKeyId(other.getPreKeyId());
          }
          if (other.hasSignedPreKeyId()) {
            setSignedPreKeyId(other.getSignedPreKeyId());
          }
          if (other.hasBaseKey()) {
            setBaseKey(other.getBaseKey());
          }
          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 {
          org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey parsedMessage = null;
          try {
            parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            parsedMessage = (org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey) e.getUnfinishedMessage();
            throw e;
          } finally {
            if (parsedMessage != null) {
              mergeFrom(parsedMessage);
            }
          }
          return this;
        }
        private int bitField0_;

        // optional uint32 preKeyId = 1;
        private int preKeyId_ ;
        /**
         * optional uint32 preKeyId = 1;
         */
        public boolean hasPreKeyId() {
          return ((bitField0_ & 0x00000001) == 0x00000001);
        }
        /**
         * optional uint32 preKeyId = 1;
         */
        public int getPreKeyId() {
          return preKeyId_;
        }
        /**
         * optional uint32 preKeyId = 1;
         */
        public Builder setPreKeyId(int value) {
          bitField0_ |= 0x00000001;
          preKeyId_ = value;
          onChanged();
          return this;
        }
        /**
         * optional uint32 preKeyId = 1;
         */
        public Builder clearPreKeyId() {
          bitField0_ = (bitField0_ & ~0x00000001);
          preKeyId_ = 0;
          onChanged();
          return this;
        }

        // optional int32 signedPreKeyId = 3;
        private int signedPreKeyId_ ;
        /**
         * optional int32 signedPreKeyId = 3;
         */
        public boolean hasSignedPreKeyId() {
          return ((bitField0_ & 0x00000002) == 0x00000002);
        }
        /**
         * optional int32 signedPreKeyId = 3;
         */
        public int getSignedPreKeyId() {
          return signedPreKeyId_;
        }
        /**
         * optional int32 signedPreKeyId = 3;
         */
        public Builder setSignedPreKeyId(int value) {
          bitField0_ |= 0x00000002;
          signedPreKeyId_ = value;
          onChanged();
          return this;
        }
        /**
         * optional int32 signedPreKeyId = 3;
         */
        public Builder clearSignedPreKeyId() {
          bitField0_ = (bitField0_ & ~0x00000002);
          signedPreKeyId_ = 0;
          onChanged();
          return this;
        }

        // optional bytes baseKey = 2;
        private com.google.protobuf.ByteString baseKey_ = com.google.protobuf.ByteString.EMPTY;
        /**
         * optional bytes baseKey = 2;
         */
        public boolean hasBaseKey() {
          return ((bitField0_ & 0x00000004) == 0x00000004);
        }
        /**
         * optional bytes baseKey = 2;
         */
        public com.google.protobuf.ByteString getBaseKey() {
          return baseKey_;
        }
        /**
         * optional bytes baseKey = 2;
         */
        public Builder setBaseKey(com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
          baseKey_ = value;
          onChanged();
          return this;
        }
        /**
         * optional bytes baseKey = 2;
         */
        public Builder clearBaseKey() {
          bitField0_ = (bitField0_ & ~0x00000004);
          baseKey_ = getDefaultInstance().getBaseKey();
          onChanged();
          return this;
        }

        // @@protoc_insertion_point(builder_scope:textsecure.SessionStructure.PendingPreKey)
      }

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

      // @@protoc_insertion_point(class_scope:textsecure.SessionStructure.PendingPreKey)
    }

    private int bitField0_;
    // optional uint32 sessionVersion = 1;
    public static final int SESSIONVERSION_FIELD_NUMBER = 1;
    private int sessionVersion_;
    /**
     * optional uint32 sessionVersion = 1;
     */
    public boolean hasSessionVersion() {
      return ((bitField0_ & 0x00000001) == 0x00000001);
    }
    /**
     * optional uint32 sessionVersion = 1;
     */
    public int getSessionVersion() {
      return sessionVersion_;
    }

    // optional bytes localIdentityPublic = 2;
    public static final int LOCALIDENTITYPUBLIC_FIELD_NUMBER = 2;
    private com.google.protobuf.ByteString localIdentityPublic_;
    /**
     * optional bytes localIdentityPublic = 2;
     */
    public boolean hasLocalIdentityPublic() {
      return ((bitField0_ & 0x00000002) == 0x00000002);
    }
    /**
     * optional bytes localIdentityPublic = 2;
     */
    public com.google.protobuf.ByteString getLocalIdentityPublic() {
      return localIdentityPublic_;
    }

    // optional bytes remoteIdentityPublic = 3;
    public static final int REMOTEIDENTITYPUBLIC_FIELD_NUMBER = 3;
    private com.google.protobuf.ByteString remoteIdentityPublic_;
    /**
     * optional bytes remoteIdentityPublic = 3;
     */
    public boolean hasRemoteIdentityPublic() {
      return ((bitField0_ & 0x00000004) == 0x00000004);
    }
    /**
     * optional bytes remoteIdentityPublic = 3;
     */
    public com.google.protobuf.ByteString getRemoteIdentityPublic() {
      return remoteIdentityPublic_;
    }

    // optional bytes rootKey = 4;
    public static final int ROOTKEY_FIELD_NUMBER = 4;
    private com.google.protobuf.ByteString rootKey_;
    /**
     * optional bytes rootKey = 4;
     */
    public boolean hasRootKey() {
      return ((bitField0_ & 0x00000008) == 0x00000008);
    }
    /**
     * optional bytes rootKey = 4;
     */
    public com.google.protobuf.ByteString getRootKey() {
      return rootKey_;
    }

    // optional uint32 previousCounter = 5;
    public static final int PREVIOUSCOUNTER_FIELD_NUMBER = 5;
    private int previousCounter_;
    /**
     * optional uint32 previousCounter = 5;
     */
    public boolean hasPreviousCounter() {
      return ((bitField0_ & 0x00000010) == 0x00000010);
    }
    /**
     * optional uint32 previousCounter = 5;
     */
    public int getPreviousCounter() {
      return previousCounter_;
    }

    // optional .textsecure.SessionStructure.Chain senderChain = 6;
    public static final int SENDERCHAIN_FIELD_NUMBER = 6;
    private org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain senderChain_;
    /**
     * optional .textsecure.SessionStructure.Chain senderChain = 6;
     */
    public boolean hasSenderChain() {
      return ((bitField0_ & 0x00000020) == 0x00000020);
    }
    /**
     * optional .textsecure.SessionStructure.Chain senderChain = 6;
     */
    public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain getSenderChain() {
      return senderChain_;
    }
    /**
     * optional .textsecure.SessionStructure.Chain senderChain = 6;
     */
    public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.ChainOrBuilder getSenderChainOrBuilder() {
      return senderChain_;
    }

    // repeated .textsecure.SessionStructure.Chain receiverChains = 7;
    public static final int RECEIVERCHAINS_FIELD_NUMBER = 7;
    private java.util.List receiverChains_;
    /**
     * repeated .textsecure.SessionStructure.Chain receiverChains = 7;
     */
    public java.util.List getReceiverChainsList() {
      return receiverChains_;
    }
    /**
     * repeated .textsecure.SessionStructure.Chain receiverChains = 7;
     */
    public java.util.List 
        getReceiverChainsOrBuilderList() {
      return receiverChains_;
    }
    /**
     * repeated .textsecure.SessionStructure.Chain receiverChains = 7;
     */
    public int getReceiverChainsCount() {
      return receiverChains_.size();
    }
    /**
     * repeated .textsecure.SessionStructure.Chain receiverChains = 7;
     */
    public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain getReceiverChains(int index) {
      return receiverChains_.get(index);
    }
    /**
     * repeated .textsecure.SessionStructure.Chain receiverChains = 7;
     */
    public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.ChainOrBuilder getReceiverChainsOrBuilder(
        int index) {
      return receiverChains_.get(index);
    }

    // optional .textsecure.SessionStructure.PendingKeyExchange pendingKeyExchange = 8;
    public static final int PENDINGKEYEXCHANGE_FIELD_NUMBER = 8;
    private org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange pendingKeyExchange_;
    /**
     * optional .textsecure.SessionStructure.PendingKeyExchange pendingKeyExchange = 8;
     */
    public boolean hasPendingKeyExchange() {
      return ((bitField0_ & 0x00000040) == 0x00000040);
    }
    /**
     * optional .textsecure.SessionStructure.PendingKeyExchange pendingKeyExchange = 8;
     */
    public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange getPendingKeyExchange() {
      return pendingKeyExchange_;
    }
    /**
     * optional .textsecure.SessionStructure.PendingKeyExchange pendingKeyExchange = 8;
     */
    public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchangeOrBuilder getPendingKeyExchangeOrBuilder() {
      return pendingKeyExchange_;
    }

    // optional .textsecure.SessionStructure.PendingPreKey pendingPreKey = 9;
    public static final int PENDINGPREKEY_FIELD_NUMBER = 9;
    private org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey pendingPreKey_;
    /**
     * optional .textsecure.SessionStructure.PendingPreKey pendingPreKey = 9;
     */
    public boolean hasPendingPreKey() {
      return ((bitField0_ & 0x00000080) == 0x00000080);
    }
    /**
     * optional .textsecure.SessionStructure.PendingPreKey pendingPreKey = 9;
     */
    public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey getPendingPreKey() {
      return pendingPreKey_;
    }
    /**
     * optional .textsecure.SessionStructure.PendingPreKey pendingPreKey = 9;
     */
    public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKeyOrBuilder getPendingPreKeyOrBuilder() {
      return pendingPreKey_;
    }

    // optional uint32 remoteRegistrationId = 10;
    public static final int REMOTEREGISTRATIONID_FIELD_NUMBER = 10;
    private int remoteRegistrationId_;
    /**
     * optional uint32 remoteRegistrationId = 10;
     */
    public boolean hasRemoteRegistrationId() {
      return ((bitField0_ & 0x00000100) == 0x00000100);
    }
    /**
     * optional uint32 remoteRegistrationId = 10;
     */
    public int getRemoteRegistrationId() {
      return remoteRegistrationId_;
    }

    // optional uint32 localRegistrationId = 11;
    public static final int LOCALREGISTRATIONID_FIELD_NUMBER = 11;
    private int localRegistrationId_;
    /**
     * optional uint32 localRegistrationId = 11;
     */
    public boolean hasLocalRegistrationId() {
      return ((bitField0_ & 0x00000200) == 0x00000200);
    }
    /**
     * optional uint32 localRegistrationId = 11;
     */
    public int getLocalRegistrationId() {
      return localRegistrationId_;
    }

    // optional bool needsRefresh = 12;
    public static final int NEEDSREFRESH_FIELD_NUMBER = 12;
    private boolean needsRefresh_;
    /**
     * optional bool needsRefresh = 12;
     */
    public boolean hasNeedsRefresh() {
      return ((bitField0_ & 0x00000400) == 0x00000400);
    }
    /**
     * optional bool needsRefresh = 12;
     */
    public boolean getNeedsRefresh() {
      return needsRefresh_;
    }

    // optional bytes aliceBaseKey = 13;
    public static final int ALICEBASEKEY_FIELD_NUMBER = 13;
    private com.google.protobuf.ByteString aliceBaseKey_;
    /**
     * optional bytes aliceBaseKey = 13;
     */
    public boolean hasAliceBaseKey() {
      return ((bitField0_ & 0x00000800) == 0x00000800);
    }
    /**
     * optional bytes aliceBaseKey = 13;
     */
    public com.google.protobuf.ByteString getAliceBaseKey() {
      return aliceBaseKey_;
    }

    private void initFields() {
      sessionVersion_ = 0;
      localIdentityPublic_ = com.google.protobuf.ByteString.EMPTY;
      remoteIdentityPublic_ = com.google.protobuf.ByteString.EMPTY;
      rootKey_ = com.google.protobuf.ByteString.EMPTY;
      previousCounter_ = 0;
      senderChain_ = org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.getDefaultInstance();
      receiverChains_ = java.util.Collections.emptyList();
      pendingKeyExchange_ = org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange.getDefaultInstance();
      pendingPreKey_ = org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey.getDefaultInstance();
      remoteRegistrationId_ = 0;
      localRegistrationId_ = 0;
      needsRefresh_ = false;
      aliceBaseKey_ = com.google.protobuf.ByteString.EMPTY;
    }
    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.writeUInt32(1, sessionVersion_);
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        output.writeBytes(2, localIdentityPublic_);
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        output.writeBytes(3, remoteIdentityPublic_);
      }
      if (((bitField0_ & 0x00000008) == 0x00000008)) {
        output.writeBytes(4, rootKey_);
      }
      if (((bitField0_ & 0x00000010) == 0x00000010)) {
        output.writeUInt32(5, previousCounter_);
      }
      if (((bitField0_ & 0x00000020) == 0x00000020)) {
        output.writeMessage(6, senderChain_);
      }
      for (int i = 0; i < receiverChains_.size(); i++) {
        output.writeMessage(7, receiverChains_.get(i));
      }
      if (((bitField0_ & 0x00000040) == 0x00000040)) {
        output.writeMessage(8, pendingKeyExchange_);
      }
      if (((bitField0_ & 0x00000080) == 0x00000080)) {
        output.writeMessage(9, pendingPreKey_);
      }
      if (((bitField0_ & 0x00000100) == 0x00000100)) {
        output.writeUInt32(10, remoteRegistrationId_);
      }
      if (((bitField0_ & 0x00000200) == 0x00000200)) {
        output.writeUInt32(11, localRegistrationId_);
      }
      if (((bitField0_ & 0x00000400) == 0x00000400)) {
        output.writeBool(12, needsRefresh_);
      }
      if (((bitField0_ & 0x00000800) == 0x00000800)) {
        output.writeBytes(13, aliceBaseKey_);
      }
      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
          .computeUInt32Size(1, sessionVersion_);
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(2, localIdentityPublic_);
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(3, remoteIdentityPublic_);
      }
      if (((bitField0_ & 0x00000008) == 0x00000008)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(4, rootKey_);
      }
      if (((bitField0_ & 0x00000010) == 0x00000010)) {
        size += com.google.protobuf.CodedOutputStream
          .computeUInt32Size(5, previousCounter_);
      }
      if (((bitField0_ & 0x00000020) == 0x00000020)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(6, senderChain_);
      }
      for (int i = 0; i < receiverChains_.size(); i++) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(7, receiverChains_.get(i));
      }
      if (((bitField0_ & 0x00000040) == 0x00000040)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(8, pendingKeyExchange_);
      }
      if (((bitField0_ & 0x00000080) == 0x00000080)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(9, pendingPreKey_);
      }
      if (((bitField0_ & 0x00000100) == 0x00000100)) {
        size += com.google.protobuf.CodedOutputStream
          .computeUInt32Size(10, remoteRegistrationId_);
      }
      if (((bitField0_ & 0x00000200) == 0x00000200)) {
        size += com.google.protobuf.CodedOutputStream
          .computeUInt32Size(11, localRegistrationId_);
      }
      if (((bitField0_ & 0x00000400) == 0x00000400)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBoolSize(12, needsRefresh_);
      }
      if (((bitField0_ & 0x00000800) == 0x00000800)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(13, aliceBaseKey_);
      }
      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 org.whispersystems.libsignal.state.StorageProtos.SessionStructure parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input, extensionRegistry);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.SessionStructure 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(org.whispersystems.libsignal.state.StorageProtos.SessionStructure 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 textsecure.SessionStructure}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessage.Builder
       implements org.whispersystems.libsignal.state.StorageProtos.SessionStructureOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.whispersystems.libsignal.state.StorageProtos.SessionStructure.class, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Builder.class);
      }

      // Construct using org.whispersystems.libsignal.state.StorageProtos.SessionStructure.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

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

      public Builder clear() {
        super.clear();
        sessionVersion_ = 0;
        bitField0_ = (bitField0_ & ~0x00000001);
        localIdentityPublic_ = com.google.protobuf.ByteString.EMPTY;
        bitField0_ = (bitField0_ & ~0x00000002);
        remoteIdentityPublic_ = com.google.protobuf.ByteString.EMPTY;
        bitField0_ = (bitField0_ & ~0x00000004);
        rootKey_ = com.google.protobuf.ByteString.EMPTY;
        bitField0_ = (bitField0_ & ~0x00000008);
        previousCounter_ = 0;
        bitField0_ = (bitField0_ & ~0x00000010);
        if (senderChainBuilder_ == null) {
          senderChain_ = org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.getDefaultInstance();
        } else {
          senderChainBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000020);
        if (receiverChainsBuilder_ == null) {
          receiverChains_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000040);
        } else {
          receiverChainsBuilder_.clear();
        }
        if (pendingKeyExchangeBuilder_ == null) {
          pendingKeyExchange_ = org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange.getDefaultInstance();
        } else {
          pendingKeyExchangeBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000080);
        if (pendingPreKeyBuilder_ == null) {
          pendingPreKey_ = org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey.getDefaultInstance();
        } else {
          pendingPreKeyBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000100);
        remoteRegistrationId_ = 0;
        bitField0_ = (bitField0_ & ~0x00000200);
        localRegistrationId_ = 0;
        bitField0_ = (bitField0_ & ~0x00000400);
        needsRefresh_ = false;
        bitField0_ = (bitField0_ & ~0x00000800);
        aliceBaseKey_ = com.google.protobuf.ByteString.EMPTY;
        bitField0_ = (bitField0_ & ~0x00001000);
        return this;
      }

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

      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_descriptor;
      }

      public org.whispersystems.libsignal.state.StorageProtos.SessionStructure getDefaultInstanceForType() {
        return org.whispersystems.libsignal.state.StorageProtos.SessionStructure.getDefaultInstance();
      }

      public org.whispersystems.libsignal.state.StorageProtos.SessionStructure build() {
        org.whispersystems.libsignal.state.StorageProtos.SessionStructure result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      public org.whispersystems.libsignal.state.StorageProtos.SessionStructure buildPartial() {
        org.whispersystems.libsignal.state.StorageProtos.SessionStructure result = new org.whispersystems.libsignal.state.StorageProtos.SessionStructure(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
          to_bitField0_ |= 0x00000001;
        }
        result.sessionVersion_ = sessionVersion_;
        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
          to_bitField0_ |= 0x00000002;
        }
        result.localIdentityPublic_ = localIdentityPublic_;
        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
          to_bitField0_ |= 0x00000004;
        }
        result.remoteIdentityPublic_ = remoteIdentityPublic_;
        if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
          to_bitField0_ |= 0x00000008;
        }
        result.rootKey_ = rootKey_;
        if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
          to_bitField0_ |= 0x00000010;
        }
        result.previousCounter_ = previousCounter_;
        if (((from_bitField0_ & 0x00000020) == 0x00000020)) {
          to_bitField0_ |= 0x00000020;
        }
        if (senderChainBuilder_ == null) {
          result.senderChain_ = senderChain_;
        } else {
          result.senderChain_ = senderChainBuilder_.build();
        }
        if (receiverChainsBuilder_ == null) {
          if (((bitField0_ & 0x00000040) == 0x00000040)) {
            receiverChains_ = java.util.Collections.unmodifiableList(receiverChains_);
            bitField0_ = (bitField0_ & ~0x00000040);
          }
          result.receiverChains_ = receiverChains_;
        } else {
          result.receiverChains_ = receiverChainsBuilder_.build();
        }
        if (((from_bitField0_ & 0x00000080) == 0x00000080)) {
          to_bitField0_ |= 0x00000040;
        }
        if (pendingKeyExchangeBuilder_ == null) {
          result.pendingKeyExchange_ = pendingKeyExchange_;
        } else {
          result.pendingKeyExchange_ = pendingKeyExchangeBuilder_.build();
        }
        if (((from_bitField0_ & 0x00000100) == 0x00000100)) {
          to_bitField0_ |= 0x00000080;
        }
        if (pendingPreKeyBuilder_ == null) {
          result.pendingPreKey_ = pendingPreKey_;
        } else {
          result.pendingPreKey_ = pendingPreKeyBuilder_.build();
        }
        if (((from_bitField0_ & 0x00000200) == 0x00000200)) {
          to_bitField0_ |= 0x00000100;
        }
        result.remoteRegistrationId_ = remoteRegistrationId_;
        if (((from_bitField0_ & 0x00000400) == 0x00000400)) {
          to_bitField0_ |= 0x00000200;
        }
        result.localRegistrationId_ = localRegistrationId_;
        if (((from_bitField0_ & 0x00000800) == 0x00000800)) {
          to_bitField0_ |= 0x00000400;
        }
        result.needsRefresh_ = needsRefresh_;
        if (((from_bitField0_ & 0x00001000) == 0x00001000)) {
          to_bitField0_ |= 0x00000800;
        }
        result.aliceBaseKey_ = aliceBaseKey_;
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof org.whispersystems.libsignal.state.StorageProtos.SessionStructure) {
          return mergeFrom((org.whispersystems.libsignal.state.StorageProtos.SessionStructure)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(org.whispersystems.libsignal.state.StorageProtos.SessionStructure other) {
        if (other == org.whispersystems.libsignal.state.StorageProtos.SessionStructure.getDefaultInstance()) return this;
        if (other.hasSessionVersion()) {
          setSessionVersion(other.getSessionVersion());
        }
        if (other.hasLocalIdentityPublic()) {
          setLocalIdentityPublic(other.getLocalIdentityPublic());
        }
        if (other.hasRemoteIdentityPublic()) {
          setRemoteIdentityPublic(other.getRemoteIdentityPublic());
        }
        if (other.hasRootKey()) {
          setRootKey(other.getRootKey());
        }
        if (other.hasPreviousCounter()) {
          setPreviousCounter(other.getPreviousCounter());
        }
        if (other.hasSenderChain()) {
          mergeSenderChain(other.getSenderChain());
        }
        if (receiverChainsBuilder_ == null) {
          if (!other.receiverChains_.isEmpty()) {
            if (receiverChains_.isEmpty()) {
              receiverChains_ = other.receiverChains_;
              bitField0_ = (bitField0_ & ~0x00000040);
            } else {
              ensureReceiverChainsIsMutable();
              receiverChains_.addAll(other.receiverChains_);
            }
            onChanged();
          }
        } else {
          if (!other.receiverChains_.isEmpty()) {
            if (receiverChainsBuilder_.isEmpty()) {
              receiverChainsBuilder_.dispose();
              receiverChainsBuilder_ = null;
              receiverChains_ = other.receiverChains_;
              bitField0_ = (bitField0_ & ~0x00000040);
              receiverChainsBuilder_ = 
                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
                   getReceiverChainsFieldBuilder() : null;
            } else {
              receiverChainsBuilder_.addAllMessages(other.receiverChains_);
            }
          }
        }
        if (other.hasPendingKeyExchange()) {
          mergePendingKeyExchange(other.getPendingKeyExchange());
        }
        if (other.hasPendingPreKey()) {
          mergePendingPreKey(other.getPendingPreKey());
        }
        if (other.hasRemoteRegistrationId()) {
          setRemoteRegistrationId(other.getRemoteRegistrationId());
        }
        if (other.hasLocalRegistrationId()) {
          setLocalRegistrationId(other.getLocalRegistrationId());
        }
        if (other.hasNeedsRefresh()) {
          setNeedsRefresh(other.getNeedsRefresh());
        }
        if (other.hasAliceBaseKey()) {
          setAliceBaseKey(other.getAliceBaseKey());
        }
        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 {
        org.whispersystems.libsignal.state.StorageProtos.SessionStructure parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (org.whispersystems.libsignal.state.StorageProtos.SessionStructure) e.getUnfinishedMessage();
          throw e;
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      // optional uint32 sessionVersion = 1;
      private int sessionVersion_ ;
      /**
       * optional uint32 sessionVersion = 1;
       */
      public boolean hasSessionVersion() {
        return ((bitField0_ & 0x00000001) == 0x00000001);
      }
      /**
       * optional uint32 sessionVersion = 1;
       */
      public int getSessionVersion() {
        return sessionVersion_;
      }
      /**
       * optional uint32 sessionVersion = 1;
       */
      public Builder setSessionVersion(int value) {
        bitField0_ |= 0x00000001;
        sessionVersion_ = value;
        onChanged();
        return this;
      }
      /**
       * optional uint32 sessionVersion = 1;
       */
      public Builder clearSessionVersion() {
        bitField0_ = (bitField0_ & ~0x00000001);
        sessionVersion_ = 0;
        onChanged();
        return this;
      }

      // optional bytes localIdentityPublic = 2;
      private com.google.protobuf.ByteString localIdentityPublic_ = com.google.protobuf.ByteString.EMPTY;
      /**
       * optional bytes localIdentityPublic = 2;
       */
      public boolean hasLocalIdentityPublic() {
        return ((bitField0_ & 0x00000002) == 0x00000002);
      }
      /**
       * optional bytes localIdentityPublic = 2;
       */
      public com.google.protobuf.ByteString getLocalIdentityPublic() {
        return localIdentityPublic_;
      }
      /**
       * optional bytes localIdentityPublic = 2;
       */
      public Builder setLocalIdentityPublic(com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
        localIdentityPublic_ = value;
        onChanged();
        return this;
      }
      /**
       * optional bytes localIdentityPublic = 2;
       */
      public Builder clearLocalIdentityPublic() {
        bitField0_ = (bitField0_ & ~0x00000002);
        localIdentityPublic_ = getDefaultInstance().getLocalIdentityPublic();
        onChanged();
        return this;
      }

      // optional bytes remoteIdentityPublic = 3;
      private com.google.protobuf.ByteString remoteIdentityPublic_ = com.google.protobuf.ByteString.EMPTY;
      /**
       * optional bytes remoteIdentityPublic = 3;
       */
      public boolean hasRemoteIdentityPublic() {
        return ((bitField0_ & 0x00000004) == 0x00000004);
      }
      /**
       * optional bytes remoteIdentityPublic = 3;
       */
      public com.google.protobuf.ByteString getRemoteIdentityPublic() {
        return remoteIdentityPublic_;
      }
      /**
       * optional bytes remoteIdentityPublic = 3;
       */
      public Builder setRemoteIdentityPublic(com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        remoteIdentityPublic_ = value;
        onChanged();
        return this;
      }
      /**
       * optional bytes remoteIdentityPublic = 3;
       */
      public Builder clearRemoteIdentityPublic() {
        bitField0_ = (bitField0_ & ~0x00000004);
        remoteIdentityPublic_ = getDefaultInstance().getRemoteIdentityPublic();
        onChanged();
        return this;
      }

      // optional bytes rootKey = 4;
      private com.google.protobuf.ByteString rootKey_ = com.google.protobuf.ByteString.EMPTY;
      /**
       * optional bytes rootKey = 4;
       */
      public boolean hasRootKey() {
        return ((bitField0_ & 0x00000008) == 0x00000008);
      }
      /**
       * optional bytes rootKey = 4;
       */
      public com.google.protobuf.ByteString getRootKey() {
        return rootKey_;
      }
      /**
       * optional bytes rootKey = 4;
       */
      public Builder setRootKey(com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        rootKey_ = value;
        onChanged();
        return this;
      }
      /**
       * optional bytes rootKey = 4;
       */
      public Builder clearRootKey() {
        bitField0_ = (bitField0_ & ~0x00000008);
        rootKey_ = getDefaultInstance().getRootKey();
        onChanged();
        return this;
      }

      // optional uint32 previousCounter = 5;
      private int previousCounter_ ;
      /**
       * optional uint32 previousCounter = 5;
       */
      public boolean hasPreviousCounter() {
        return ((bitField0_ & 0x00000010) == 0x00000010);
      }
      /**
       * optional uint32 previousCounter = 5;
       */
      public int getPreviousCounter() {
        return previousCounter_;
      }
      /**
       * optional uint32 previousCounter = 5;
       */
      public Builder setPreviousCounter(int value) {
        bitField0_ |= 0x00000010;
        previousCounter_ = value;
        onChanged();
        return this;
      }
      /**
       * optional uint32 previousCounter = 5;
       */
      public Builder clearPreviousCounter() {
        bitField0_ = (bitField0_ & ~0x00000010);
        previousCounter_ = 0;
        onChanged();
        return this;
      }

      // optional .textsecure.SessionStructure.Chain senderChain = 6;
      private org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain senderChain_ = org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.getDefaultInstance();
      private com.google.protobuf.SingleFieldBuilder<
          org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.Builder, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.ChainOrBuilder> senderChainBuilder_;
      /**
       * optional .textsecure.SessionStructure.Chain senderChain = 6;
       */
      public boolean hasSenderChain() {
        return ((bitField0_ & 0x00000020) == 0x00000020);
      }
      /**
       * optional .textsecure.SessionStructure.Chain senderChain = 6;
       */
      public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain getSenderChain() {
        if (senderChainBuilder_ == null) {
          return senderChain_;
        } else {
          return senderChainBuilder_.getMessage();
        }
      }
      /**
       * optional .textsecure.SessionStructure.Chain senderChain = 6;
       */
      public Builder setSenderChain(org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain value) {
        if (senderChainBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          senderChain_ = value;
          onChanged();
        } else {
          senderChainBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000020;
        return this;
      }
      /**
       * optional .textsecure.SessionStructure.Chain senderChain = 6;
       */
      public Builder setSenderChain(
          org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.Builder builderForValue) {
        if (senderChainBuilder_ == null) {
          senderChain_ = builderForValue.build();
          onChanged();
        } else {
          senderChainBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000020;
        return this;
      }
      /**
       * optional .textsecure.SessionStructure.Chain senderChain = 6;
       */
      public Builder mergeSenderChain(org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain value) {
        if (senderChainBuilder_ == null) {
          if (((bitField0_ & 0x00000020) == 0x00000020) &&
              senderChain_ != org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.getDefaultInstance()) {
            senderChain_ =
              org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.newBuilder(senderChain_).mergeFrom(value).buildPartial();
          } else {
            senderChain_ = value;
          }
          onChanged();
        } else {
          senderChainBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000020;
        return this;
      }
      /**
       * optional .textsecure.SessionStructure.Chain senderChain = 6;
       */
      public Builder clearSenderChain() {
        if (senderChainBuilder_ == null) {
          senderChain_ = org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.getDefaultInstance();
          onChanged();
        } else {
          senderChainBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000020);
        return this;
      }
      /**
       * optional .textsecure.SessionStructure.Chain senderChain = 6;
       */
      public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.Builder getSenderChainBuilder() {
        bitField0_ |= 0x00000020;
        onChanged();
        return getSenderChainFieldBuilder().getBuilder();
      }
      /**
       * optional .textsecure.SessionStructure.Chain senderChain = 6;
       */
      public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.ChainOrBuilder getSenderChainOrBuilder() {
        if (senderChainBuilder_ != null) {
          return senderChainBuilder_.getMessageOrBuilder();
        } else {
          return senderChain_;
        }
      }
      /**
       * optional .textsecure.SessionStructure.Chain senderChain = 6;
       */
      private com.google.protobuf.SingleFieldBuilder<
          org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.Builder, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.ChainOrBuilder> 
          getSenderChainFieldBuilder() {
        if (senderChainBuilder_ == null) {
          senderChainBuilder_ = new com.google.protobuf.SingleFieldBuilder<
              org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.Builder, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.ChainOrBuilder>(
                  senderChain_,
                  getParentForChildren(),
                  isClean());
          senderChain_ = null;
        }
        return senderChainBuilder_;
      }

      // repeated .textsecure.SessionStructure.Chain receiverChains = 7;
      private java.util.List receiverChains_ =
        java.util.Collections.emptyList();
      private void ensureReceiverChainsIsMutable() {
        if (!((bitField0_ & 0x00000040) == 0x00000040)) {
          receiverChains_ = new java.util.ArrayList(receiverChains_);
          bitField0_ |= 0x00000040;
         }
      }

      private com.google.protobuf.RepeatedFieldBuilder<
          org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.Builder, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.ChainOrBuilder> receiverChainsBuilder_;

      /**
       * repeated .textsecure.SessionStructure.Chain receiverChains = 7;
       */
      public java.util.List getReceiverChainsList() {
        if (receiverChainsBuilder_ == null) {
          return java.util.Collections.unmodifiableList(receiverChains_);
        } else {
          return receiverChainsBuilder_.getMessageList();
        }
      }
      /**
       * repeated .textsecure.SessionStructure.Chain receiverChains = 7;
       */
      public int getReceiverChainsCount() {
        if (receiverChainsBuilder_ == null) {
          return receiverChains_.size();
        } else {
          return receiverChainsBuilder_.getCount();
        }
      }
      /**
       * repeated .textsecure.SessionStructure.Chain receiverChains = 7;
       */
      public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain getReceiverChains(int index) {
        if (receiverChainsBuilder_ == null) {
          return receiverChains_.get(index);
        } else {
          return receiverChainsBuilder_.getMessage(index);
        }
      }
      /**
       * repeated .textsecure.SessionStructure.Chain receiverChains = 7;
       */
      public Builder setReceiverChains(
          int index, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain value) {
        if (receiverChainsBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureReceiverChainsIsMutable();
          receiverChains_.set(index, value);
          onChanged();
        } else {
          receiverChainsBuilder_.setMessage(index, value);
        }
        return this;
      }
      /**
       * repeated .textsecure.SessionStructure.Chain receiverChains = 7;
       */
      public Builder setReceiverChains(
          int index, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.Builder builderForValue) {
        if (receiverChainsBuilder_ == null) {
          ensureReceiverChainsIsMutable();
          receiverChains_.set(index, builderForValue.build());
          onChanged();
        } else {
          receiverChainsBuilder_.setMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * repeated .textsecure.SessionStructure.Chain receiverChains = 7;
       */
      public Builder addReceiverChains(org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain value) {
        if (receiverChainsBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureReceiverChainsIsMutable();
          receiverChains_.add(value);
          onChanged();
        } else {
          receiverChainsBuilder_.addMessage(value);
        }
        return this;
      }
      /**
       * repeated .textsecure.SessionStructure.Chain receiverChains = 7;
       */
      public Builder addReceiverChains(
          int index, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain value) {
        if (receiverChainsBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureReceiverChainsIsMutable();
          receiverChains_.add(index, value);
          onChanged();
        } else {
          receiverChainsBuilder_.addMessage(index, value);
        }
        return this;
      }
      /**
       * repeated .textsecure.SessionStructure.Chain receiverChains = 7;
       */
      public Builder addReceiverChains(
          org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.Builder builderForValue) {
        if (receiverChainsBuilder_ == null) {
          ensureReceiverChainsIsMutable();
          receiverChains_.add(builderForValue.build());
          onChanged();
        } else {
          receiverChainsBuilder_.addMessage(builderForValue.build());
        }
        return this;
      }
      /**
       * repeated .textsecure.SessionStructure.Chain receiverChains = 7;
       */
      public Builder addReceiverChains(
          int index, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.Builder builderForValue) {
        if (receiverChainsBuilder_ == null) {
          ensureReceiverChainsIsMutable();
          receiverChains_.add(index, builderForValue.build());
          onChanged();
        } else {
          receiverChainsBuilder_.addMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * repeated .textsecure.SessionStructure.Chain receiverChains = 7;
       */
      public Builder addAllReceiverChains(
          java.lang.Iterable values) {
        if (receiverChainsBuilder_ == null) {
          ensureReceiverChainsIsMutable();
          super.addAll(values, receiverChains_);
          onChanged();
        } else {
          receiverChainsBuilder_.addAllMessages(values);
        }
        return this;
      }
      /**
       * repeated .textsecure.SessionStructure.Chain receiverChains = 7;
       */
      public Builder clearReceiverChains() {
        if (receiverChainsBuilder_ == null) {
          receiverChains_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000040);
          onChanged();
        } else {
          receiverChainsBuilder_.clear();
        }
        return this;
      }
      /**
       * repeated .textsecure.SessionStructure.Chain receiverChains = 7;
       */
      public Builder removeReceiverChains(int index) {
        if (receiverChainsBuilder_ == null) {
          ensureReceiverChainsIsMutable();
          receiverChains_.remove(index);
          onChanged();
        } else {
          receiverChainsBuilder_.remove(index);
        }
        return this;
      }
      /**
       * repeated .textsecure.SessionStructure.Chain receiverChains = 7;
       */
      public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.Builder getReceiverChainsBuilder(
          int index) {
        return getReceiverChainsFieldBuilder().getBuilder(index);
      }
      /**
       * repeated .textsecure.SessionStructure.Chain receiverChains = 7;
       */
      public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.ChainOrBuilder getReceiverChainsOrBuilder(
          int index) {
        if (receiverChainsBuilder_ == null) {
          return receiverChains_.get(index);  } else {
          return receiverChainsBuilder_.getMessageOrBuilder(index);
        }
      }
      /**
       * repeated .textsecure.SessionStructure.Chain receiverChains = 7;
       */
      public java.util.List 
           getReceiverChainsOrBuilderList() {
        if (receiverChainsBuilder_ != null) {
          return receiverChainsBuilder_.getMessageOrBuilderList();
        } else {
          return java.util.Collections.unmodifiableList(receiverChains_);
        }
      }
      /**
       * repeated .textsecure.SessionStructure.Chain receiverChains = 7;
       */
      public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.Builder addReceiverChainsBuilder() {
        return getReceiverChainsFieldBuilder().addBuilder(
            org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.getDefaultInstance());
      }
      /**
       * repeated .textsecure.SessionStructure.Chain receiverChains = 7;
       */
      public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.Builder addReceiverChainsBuilder(
          int index) {
        return getReceiverChainsFieldBuilder().addBuilder(
            index, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.getDefaultInstance());
      }
      /**
       * repeated .textsecure.SessionStructure.Chain receiverChains = 7;
       */
      public java.util.List 
           getReceiverChainsBuilderList() {
        return getReceiverChainsFieldBuilder().getBuilderList();
      }
      private com.google.protobuf.RepeatedFieldBuilder<
          org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.Builder, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.ChainOrBuilder> 
          getReceiverChainsFieldBuilder() {
        if (receiverChainsBuilder_ == null) {
          receiverChainsBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
              org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Chain.Builder, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.ChainOrBuilder>(
                  receiverChains_,
                  ((bitField0_ & 0x00000040) == 0x00000040),
                  getParentForChildren(),
                  isClean());
          receiverChains_ = null;
        }
        return receiverChainsBuilder_;
      }

      // optional .textsecure.SessionStructure.PendingKeyExchange pendingKeyExchange = 8;
      private org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange pendingKeyExchange_ = org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange.getDefaultInstance();
      private com.google.protobuf.SingleFieldBuilder<
          org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange.Builder, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchangeOrBuilder> pendingKeyExchangeBuilder_;
      /**
       * optional .textsecure.SessionStructure.PendingKeyExchange pendingKeyExchange = 8;
       */
      public boolean hasPendingKeyExchange() {
        return ((bitField0_ & 0x00000080) == 0x00000080);
      }
      /**
       * optional .textsecure.SessionStructure.PendingKeyExchange pendingKeyExchange = 8;
       */
      public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange getPendingKeyExchange() {
        if (pendingKeyExchangeBuilder_ == null) {
          return pendingKeyExchange_;
        } else {
          return pendingKeyExchangeBuilder_.getMessage();
        }
      }
      /**
       * optional .textsecure.SessionStructure.PendingKeyExchange pendingKeyExchange = 8;
       */
      public Builder setPendingKeyExchange(org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange value) {
        if (pendingKeyExchangeBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          pendingKeyExchange_ = value;
          onChanged();
        } else {
          pendingKeyExchangeBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000080;
        return this;
      }
      /**
       * optional .textsecure.SessionStructure.PendingKeyExchange pendingKeyExchange = 8;
       */
      public Builder setPendingKeyExchange(
          org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange.Builder builderForValue) {
        if (pendingKeyExchangeBuilder_ == null) {
          pendingKeyExchange_ = builderForValue.build();
          onChanged();
        } else {
          pendingKeyExchangeBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000080;
        return this;
      }
      /**
       * optional .textsecure.SessionStructure.PendingKeyExchange pendingKeyExchange = 8;
       */
      public Builder mergePendingKeyExchange(org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange value) {
        if (pendingKeyExchangeBuilder_ == null) {
          if (((bitField0_ & 0x00000080) == 0x00000080) &&
              pendingKeyExchange_ != org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange.getDefaultInstance()) {
            pendingKeyExchange_ =
              org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange.newBuilder(pendingKeyExchange_).mergeFrom(value).buildPartial();
          } else {
            pendingKeyExchange_ = value;
          }
          onChanged();
        } else {
          pendingKeyExchangeBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000080;
        return this;
      }
      /**
       * optional .textsecure.SessionStructure.PendingKeyExchange pendingKeyExchange = 8;
       */
      public Builder clearPendingKeyExchange() {
        if (pendingKeyExchangeBuilder_ == null) {
          pendingKeyExchange_ = org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange.getDefaultInstance();
          onChanged();
        } else {
          pendingKeyExchangeBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000080);
        return this;
      }
      /**
       * optional .textsecure.SessionStructure.PendingKeyExchange pendingKeyExchange = 8;
       */
      public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange.Builder getPendingKeyExchangeBuilder() {
        bitField0_ |= 0x00000080;
        onChanged();
        return getPendingKeyExchangeFieldBuilder().getBuilder();
      }
      /**
       * optional .textsecure.SessionStructure.PendingKeyExchange pendingKeyExchange = 8;
       */
      public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchangeOrBuilder getPendingKeyExchangeOrBuilder() {
        if (pendingKeyExchangeBuilder_ != null) {
          return pendingKeyExchangeBuilder_.getMessageOrBuilder();
        } else {
          return pendingKeyExchange_;
        }
      }
      /**
       * optional .textsecure.SessionStructure.PendingKeyExchange pendingKeyExchange = 8;
       */
      private com.google.protobuf.SingleFieldBuilder<
          org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange.Builder, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchangeOrBuilder> 
          getPendingKeyExchangeFieldBuilder() {
        if (pendingKeyExchangeBuilder_ == null) {
          pendingKeyExchangeBuilder_ = new com.google.protobuf.SingleFieldBuilder<
              org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange.Builder, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchangeOrBuilder>(
                  pendingKeyExchange_,
                  getParentForChildren(),
                  isClean());
          pendingKeyExchange_ = null;
        }
        return pendingKeyExchangeBuilder_;
      }

      // optional .textsecure.SessionStructure.PendingPreKey pendingPreKey = 9;
      private org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey pendingPreKey_ = org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey.getDefaultInstance();
      private com.google.protobuf.SingleFieldBuilder<
          org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey.Builder, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKeyOrBuilder> pendingPreKeyBuilder_;
      /**
       * optional .textsecure.SessionStructure.PendingPreKey pendingPreKey = 9;
       */
      public boolean hasPendingPreKey() {
        return ((bitField0_ & 0x00000100) == 0x00000100);
      }
      /**
       * optional .textsecure.SessionStructure.PendingPreKey pendingPreKey = 9;
       */
      public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey getPendingPreKey() {
        if (pendingPreKeyBuilder_ == null) {
          return pendingPreKey_;
        } else {
          return pendingPreKeyBuilder_.getMessage();
        }
      }
      /**
       * optional .textsecure.SessionStructure.PendingPreKey pendingPreKey = 9;
       */
      public Builder setPendingPreKey(org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey value) {
        if (pendingPreKeyBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          pendingPreKey_ = value;
          onChanged();
        } else {
          pendingPreKeyBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000100;
        return this;
      }
      /**
       * optional .textsecure.SessionStructure.PendingPreKey pendingPreKey = 9;
       */
      public Builder setPendingPreKey(
          org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey.Builder builderForValue) {
        if (pendingPreKeyBuilder_ == null) {
          pendingPreKey_ = builderForValue.build();
          onChanged();
        } else {
          pendingPreKeyBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000100;
        return this;
      }
      /**
       * optional .textsecure.SessionStructure.PendingPreKey pendingPreKey = 9;
       */
      public Builder mergePendingPreKey(org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey value) {
        if (pendingPreKeyBuilder_ == null) {
          if (((bitField0_ & 0x00000100) == 0x00000100) &&
              pendingPreKey_ != org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey.getDefaultInstance()) {
            pendingPreKey_ =
              org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey.newBuilder(pendingPreKey_).mergeFrom(value).buildPartial();
          } else {
            pendingPreKey_ = value;
          }
          onChanged();
        } else {
          pendingPreKeyBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000100;
        return this;
      }
      /**
       * optional .textsecure.SessionStructure.PendingPreKey pendingPreKey = 9;
       */
      public Builder clearPendingPreKey() {
        if (pendingPreKeyBuilder_ == null) {
          pendingPreKey_ = org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey.getDefaultInstance();
          onChanged();
        } else {
          pendingPreKeyBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000100);
        return this;
      }
      /**
       * optional .textsecure.SessionStructure.PendingPreKey pendingPreKey = 9;
       */
      public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey.Builder getPendingPreKeyBuilder() {
        bitField0_ |= 0x00000100;
        onChanged();
        return getPendingPreKeyFieldBuilder().getBuilder();
      }
      /**
       * optional .textsecure.SessionStructure.PendingPreKey pendingPreKey = 9;
       */
      public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKeyOrBuilder getPendingPreKeyOrBuilder() {
        if (pendingPreKeyBuilder_ != null) {
          return pendingPreKeyBuilder_.getMessageOrBuilder();
        } else {
          return pendingPreKey_;
        }
      }
      /**
       * optional .textsecure.SessionStructure.PendingPreKey pendingPreKey = 9;
       */
      private com.google.protobuf.SingleFieldBuilder<
          org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey.Builder, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKeyOrBuilder> 
          getPendingPreKeyFieldBuilder() {
        if (pendingPreKeyBuilder_ == null) {
          pendingPreKeyBuilder_ = new com.google.protobuf.SingleFieldBuilder<
              org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKey.Builder, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PendingPreKeyOrBuilder>(
                  pendingPreKey_,
                  getParentForChildren(),
                  isClean());
          pendingPreKey_ = null;
        }
        return pendingPreKeyBuilder_;
      }

      // optional uint32 remoteRegistrationId = 10;
      private int remoteRegistrationId_ ;
      /**
       * optional uint32 remoteRegistrationId = 10;
       */
      public boolean hasRemoteRegistrationId() {
        return ((bitField0_ & 0x00000200) == 0x00000200);
      }
      /**
       * optional uint32 remoteRegistrationId = 10;
       */
      public int getRemoteRegistrationId() {
        return remoteRegistrationId_;
      }
      /**
       * optional uint32 remoteRegistrationId = 10;
       */
      public Builder setRemoteRegistrationId(int value) {
        bitField0_ |= 0x00000200;
        remoteRegistrationId_ = value;
        onChanged();
        return this;
      }
      /**
       * optional uint32 remoteRegistrationId = 10;
       */
      public Builder clearRemoteRegistrationId() {
        bitField0_ = (bitField0_ & ~0x00000200);
        remoteRegistrationId_ = 0;
        onChanged();
        return this;
      }

      // optional uint32 localRegistrationId = 11;
      private int localRegistrationId_ ;
      /**
       * optional uint32 localRegistrationId = 11;
       */
      public boolean hasLocalRegistrationId() {
        return ((bitField0_ & 0x00000400) == 0x00000400);
      }
      /**
       * optional uint32 localRegistrationId = 11;
       */
      public int getLocalRegistrationId() {
        return localRegistrationId_;
      }
      /**
       * optional uint32 localRegistrationId = 11;
       */
      public Builder setLocalRegistrationId(int value) {
        bitField0_ |= 0x00000400;
        localRegistrationId_ = value;
        onChanged();
        return this;
      }
      /**
       * optional uint32 localRegistrationId = 11;
       */
      public Builder clearLocalRegistrationId() {
        bitField0_ = (bitField0_ & ~0x00000400);
        localRegistrationId_ = 0;
        onChanged();
        return this;
      }

      // optional bool needsRefresh = 12;
      private boolean needsRefresh_ ;
      /**
       * optional bool needsRefresh = 12;
       */
      public boolean hasNeedsRefresh() {
        return ((bitField0_ & 0x00000800) == 0x00000800);
      }
      /**
       * optional bool needsRefresh = 12;
       */
      public boolean getNeedsRefresh() {
        return needsRefresh_;
      }
      /**
       * optional bool needsRefresh = 12;
       */
      public Builder setNeedsRefresh(boolean value) {
        bitField0_ |= 0x00000800;
        needsRefresh_ = value;
        onChanged();
        return this;
      }
      /**
       * optional bool needsRefresh = 12;
       */
      public Builder clearNeedsRefresh() {
        bitField0_ = (bitField0_ & ~0x00000800);
        needsRefresh_ = false;
        onChanged();
        return this;
      }

      // optional bytes aliceBaseKey = 13;
      private com.google.protobuf.ByteString aliceBaseKey_ = com.google.protobuf.ByteString.EMPTY;
      /**
       * optional bytes aliceBaseKey = 13;
       */
      public boolean hasAliceBaseKey() {
        return ((bitField0_ & 0x00001000) == 0x00001000);
      }
      /**
       * optional bytes aliceBaseKey = 13;
       */
      public com.google.protobuf.ByteString getAliceBaseKey() {
        return aliceBaseKey_;
      }
      /**
       * optional bytes aliceBaseKey = 13;
       */
      public Builder setAliceBaseKey(com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00001000;
        aliceBaseKey_ = value;
        onChanged();
        return this;
      }
      /**
       * optional bytes aliceBaseKey = 13;
       */
      public Builder clearAliceBaseKey() {
        bitField0_ = (bitField0_ & ~0x00001000);
        aliceBaseKey_ = getDefaultInstance().getAliceBaseKey();
        onChanged();
        return this;
      }

      // @@protoc_insertion_point(builder_scope:textsecure.SessionStructure)
    }

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

    // @@protoc_insertion_point(class_scope:textsecure.SessionStructure)
  }

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

    // optional .textsecure.SessionStructure currentSession = 1;
    /**
     * optional .textsecure.SessionStructure currentSession = 1;
     */
    boolean hasCurrentSession();
    /**
     * optional .textsecure.SessionStructure currentSession = 1;
     */
    org.whispersystems.libsignal.state.StorageProtos.SessionStructure getCurrentSession();
    /**
     * optional .textsecure.SessionStructure currentSession = 1;
     */
    org.whispersystems.libsignal.state.StorageProtos.SessionStructureOrBuilder getCurrentSessionOrBuilder();

    // repeated .textsecure.SessionStructure previousSessions = 2;
    /**
     * repeated .textsecure.SessionStructure previousSessions = 2;
     */
    java.util.List 
        getPreviousSessionsList();
    /**
     * repeated .textsecure.SessionStructure previousSessions = 2;
     */
    org.whispersystems.libsignal.state.StorageProtos.SessionStructure getPreviousSessions(int index);
    /**
     * repeated .textsecure.SessionStructure previousSessions = 2;
     */
    int getPreviousSessionsCount();
    /**
     * repeated .textsecure.SessionStructure previousSessions = 2;
     */
    java.util.List 
        getPreviousSessionsOrBuilderList();
    /**
     * repeated .textsecure.SessionStructure previousSessions = 2;
     */
    org.whispersystems.libsignal.state.StorageProtos.SessionStructureOrBuilder getPreviousSessionsOrBuilder(
        int index);
  }
  /**
   * Protobuf type {@code textsecure.RecordStructure}
   */
  public static final class RecordStructure extends
      com.google.protobuf.GeneratedMessage
      implements RecordStructureOrBuilder {
    // Use RecordStructure.newBuilder() to construct.
    private RecordStructure(com.google.protobuf.GeneratedMessage.Builder builder) {
      super(builder);
      this.unknownFields = builder.getUnknownFields();
    }
    private RecordStructure(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

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

    public RecordStructure getDefaultInstanceForType() {
      return defaultInstance;
    }

    private final com.google.protobuf.UnknownFieldSet unknownFields;
    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
      return this.unknownFields;
    }
    private RecordStructure(
        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: {
              org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Builder subBuilder = null;
              if (((bitField0_ & 0x00000001) == 0x00000001)) {
                subBuilder = currentSession_.toBuilder();
              }
              currentSession_ = input.readMessage(org.whispersystems.libsignal.state.StorageProtos.SessionStructure.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(currentSession_);
                currentSession_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000001;
              break;
            }
            case 18: {
              if (!((mutable_bitField0_ & 0x00000002) == 0x00000002)) {
                previousSessions_ = new java.util.ArrayList();
                mutable_bitField0_ |= 0x00000002;
              }
              previousSessions_.add(input.readMessage(org.whispersystems.libsignal.state.StorageProtos.SessionStructure.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_ & 0x00000002) == 0x00000002)) {
          previousSessions_ = java.util.Collections.unmodifiableList(previousSessions_);
        }
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_RecordStructure_descriptor;
    }

    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_RecordStructure_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              org.whispersystems.libsignal.state.StorageProtos.RecordStructure.class, org.whispersystems.libsignal.state.StorageProtos.RecordStructure.Builder.class);
    }

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

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

    private int bitField0_;
    // optional .textsecure.SessionStructure currentSession = 1;
    public static final int CURRENTSESSION_FIELD_NUMBER = 1;
    private org.whispersystems.libsignal.state.StorageProtos.SessionStructure currentSession_;
    /**
     * optional .textsecure.SessionStructure currentSession = 1;
     */
    public boolean hasCurrentSession() {
      return ((bitField0_ & 0x00000001) == 0x00000001);
    }
    /**
     * optional .textsecure.SessionStructure currentSession = 1;
     */
    public org.whispersystems.libsignal.state.StorageProtos.SessionStructure getCurrentSession() {
      return currentSession_;
    }
    /**
     * optional .textsecure.SessionStructure currentSession = 1;
     */
    public org.whispersystems.libsignal.state.StorageProtos.SessionStructureOrBuilder getCurrentSessionOrBuilder() {
      return currentSession_;
    }

    // repeated .textsecure.SessionStructure previousSessions = 2;
    public static final int PREVIOUSSESSIONS_FIELD_NUMBER = 2;
    private java.util.List previousSessions_;
    /**
     * repeated .textsecure.SessionStructure previousSessions = 2;
     */
    public java.util.List getPreviousSessionsList() {
      return previousSessions_;
    }
    /**
     * repeated .textsecure.SessionStructure previousSessions = 2;
     */
    public java.util.List 
        getPreviousSessionsOrBuilderList() {
      return previousSessions_;
    }
    /**
     * repeated .textsecure.SessionStructure previousSessions = 2;
     */
    public int getPreviousSessionsCount() {
      return previousSessions_.size();
    }
    /**
     * repeated .textsecure.SessionStructure previousSessions = 2;
     */
    public org.whispersystems.libsignal.state.StorageProtos.SessionStructure getPreviousSessions(int index) {
      return previousSessions_.get(index);
    }
    /**
     * repeated .textsecure.SessionStructure previousSessions = 2;
     */
    public org.whispersystems.libsignal.state.StorageProtos.SessionStructureOrBuilder getPreviousSessionsOrBuilder(
        int index) {
      return previousSessions_.get(index);
    }

    private void initFields() {
      currentSession_ = org.whispersystems.libsignal.state.StorageProtos.SessionStructure.getDefaultInstance();
      previousSessions_ = java.util.Collections.emptyList();
    }
    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.writeMessage(1, currentSession_);
      }
      for (int i = 0; i < previousSessions_.size(); i++) {
        output.writeMessage(2, previousSessions_.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
          .computeMessageSize(1, currentSession_);
      }
      for (int i = 0; i < previousSessions_.size(); i++) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(2, previousSessions_.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 org.whispersystems.libsignal.state.StorageProtos.RecordStructure parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.RecordStructure parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.RecordStructure parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.RecordStructure parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.RecordStructure parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.RecordStructure parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.RecordStructure parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.RecordStructure parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input, extensionRegistry);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.RecordStructure parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.RecordStructure 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(org.whispersystems.libsignal.state.StorageProtos.RecordStructure 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 textsecure.RecordStructure}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessage.Builder
       implements org.whispersystems.libsignal.state.StorageProtos.RecordStructureOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_RecordStructure_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_RecordStructure_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.whispersystems.libsignal.state.StorageProtos.RecordStructure.class, org.whispersystems.libsignal.state.StorageProtos.RecordStructure.Builder.class);
      }

      // Construct using org.whispersystems.libsignal.state.StorageProtos.RecordStructure.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

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

      public Builder clear() {
        super.clear();
        if (currentSessionBuilder_ == null) {
          currentSession_ = org.whispersystems.libsignal.state.StorageProtos.SessionStructure.getDefaultInstance();
        } else {
          currentSessionBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000001);
        if (previousSessionsBuilder_ == null) {
          previousSessions_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000002);
        } else {
          previousSessionsBuilder_.clear();
        }
        return this;
      }

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

      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_RecordStructure_descriptor;
      }

      public org.whispersystems.libsignal.state.StorageProtos.RecordStructure getDefaultInstanceForType() {
        return org.whispersystems.libsignal.state.StorageProtos.RecordStructure.getDefaultInstance();
      }

      public org.whispersystems.libsignal.state.StorageProtos.RecordStructure build() {
        org.whispersystems.libsignal.state.StorageProtos.RecordStructure result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      public org.whispersystems.libsignal.state.StorageProtos.RecordStructure buildPartial() {
        org.whispersystems.libsignal.state.StorageProtos.RecordStructure result = new org.whispersystems.libsignal.state.StorageProtos.RecordStructure(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
          to_bitField0_ |= 0x00000001;
        }
        if (currentSessionBuilder_ == null) {
          result.currentSession_ = currentSession_;
        } else {
          result.currentSession_ = currentSessionBuilder_.build();
        }
        if (previousSessionsBuilder_ == null) {
          if (((bitField0_ & 0x00000002) == 0x00000002)) {
            previousSessions_ = java.util.Collections.unmodifiableList(previousSessions_);
            bitField0_ = (bitField0_ & ~0x00000002);
          }
          result.previousSessions_ = previousSessions_;
        } else {
          result.previousSessions_ = previousSessionsBuilder_.build();
        }
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof org.whispersystems.libsignal.state.StorageProtos.RecordStructure) {
          return mergeFrom((org.whispersystems.libsignal.state.StorageProtos.RecordStructure)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(org.whispersystems.libsignal.state.StorageProtos.RecordStructure other) {
        if (other == org.whispersystems.libsignal.state.StorageProtos.RecordStructure.getDefaultInstance()) return this;
        if (other.hasCurrentSession()) {
          mergeCurrentSession(other.getCurrentSession());
        }
        if (previousSessionsBuilder_ == null) {
          if (!other.previousSessions_.isEmpty()) {
            if (previousSessions_.isEmpty()) {
              previousSessions_ = other.previousSessions_;
              bitField0_ = (bitField0_ & ~0x00000002);
            } else {
              ensurePreviousSessionsIsMutable();
              previousSessions_.addAll(other.previousSessions_);
            }
            onChanged();
          }
        } else {
          if (!other.previousSessions_.isEmpty()) {
            if (previousSessionsBuilder_.isEmpty()) {
              previousSessionsBuilder_.dispose();
              previousSessionsBuilder_ = null;
              previousSessions_ = other.previousSessions_;
              bitField0_ = (bitField0_ & ~0x00000002);
              previousSessionsBuilder_ = 
                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
                   getPreviousSessionsFieldBuilder() : null;
            } else {
              previousSessionsBuilder_.addAllMessages(other.previousSessions_);
            }
          }
        }
        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 {
        org.whispersystems.libsignal.state.StorageProtos.RecordStructure parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (org.whispersystems.libsignal.state.StorageProtos.RecordStructure) e.getUnfinishedMessage();
          throw e;
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      // optional .textsecure.SessionStructure currentSession = 1;
      private org.whispersystems.libsignal.state.StorageProtos.SessionStructure currentSession_ = org.whispersystems.libsignal.state.StorageProtos.SessionStructure.getDefaultInstance();
      private com.google.protobuf.SingleFieldBuilder<
          org.whispersystems.libsignal.state.StorageProtos.SessionStructure, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Builder, org.whispersystems.libsignal.state.StorageProtos.SessionStructureOrBuilder> currentSessionBuilder_;
      /**
       * optional .textsecure.SessionStructure currentSession = 1;
       */
      public boolean hasCurrentSession() {
        return ((bitField0_ & 0x00000001) == 0x00000001);
      }
      /**
       * optional .textsecure.SessionStructure currentSession = 1;
       */
      public org.whispersystems.libsignal.state.StorageProtos.SessionStructure getCurrentSession() {
        if (currentSessionBuilder_ == null) {
          return currentSession_;
        } else {
          return currentSessionBuilder_.getMessage();
        }
      }
      /**
       * optional .textsecure.SessionStructure currentSession = 1;
       */
      public Builder setCurrentSession(org.whispersystems.libsignal.state.StorageProtos.SessionStructure value) {
        if (currentSessionBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          currentSession_ = value;
          onChanged();
        } else {
          currentSessionBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * optional .textsecure.SessionStructure currentSession = 1;
       */
      public Builder setCurrentSession(
          org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Builder builderForValue) {
        if (currentSessionBuilder_ == null) {
          currentSession_ = builderForValue.build();
          onChanged();
        } else {
          currentSessionBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * optional .textsecure.SessionStructure currentSession = 1;
       */
      public Builder mergeCurrentSession(org.whispersystems.libsignal.state.StorageProtos.SessionStructure value) {
        if (currentSessionBuilder_ == null) {
          if (((bitField0_ & 0x00000001) == 0x00000001) &&
              currentSession_ != org.whispersystems.libsignal.state.StorageProtos.SessionStructure.getDefaultInstance()) {
            currentSession_ =
              org.whispersystems.libsignal.state.StorageProtos.SessionStructure.newBuilder(currentSession_).mergeFrom(value).buildPartial();
          } else {
            currentSession_ = value;
          }
          onChanged();
        } else {
          currentSessionBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * optional .textsecure.SessionStructure currentSession = 1;
       */
      public Builder clearCurrentSession() {
        if (currentSessionBuilder_ == null) {
          currentSession_ = org.whispersystems.libsignal.state.StorageProtos.SessionStructure.getDefaultInstance();
          onChanged();
        } else {
          currentSessionBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000001);
        return this;
      }
      /**
       * optional .textsecure.SessionStructure currentSession = 1;
       */
      public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Builder getCurrentSessionBuilder() {
        bitField0_ |= 0x00000001;
        onChanged();
        return getCurrentSessionFieldBuilder().getBuilder();
      }
      /**
       * optional .textsecure.SessionStructure currentSession = 1;
       */
      public org.whispersystems.libsignal.state.StorageProtos.SessionStructureOrBuilder getCurrentSessionOrBuilder() {
        if (currentSessionBuilder_ != null) {
          return currentSessionBuilder_.getMessageOrBuilder();
        } else {
          return currentSession_;
        }
      }
      /**
       * optional .textsecure.SessionStructure currentSession = 1;
       */
      private com.google.protobuf.SingleFieldBuilder<
          org.whispersystems.libsignal.state.StorageProtos.SessionStructure, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Builder, org.whispersystems.libsignal.state.StorageProtos.SessionStructureOrBuilder> 
          getCurrentSessionFieldBuilder() {
        if (currentSessionBuilder_ == null) {
          currentSessionBuilder_ = new com.google.protobuf.SingleFieldBuilder<
              org.whispersystems.libsignal.state.StorageProtos.SessionStructure, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Builder, org.whispersystems.libsignal.state.StorageProtos.SessionStructureOrBuilder>(
                  currentSession_,
                  getParentForChildren(),
                  isClean());
          currentSession_ = null;
        }
        return currentSessionBuilder_;
      }

      // repeated .textsecure.SessionStructure previousSessions = 2;
      private java.util.List previousSessions_ =
        java.util.Collections.emptyList();
      private void ensurePreviousSessionsIsMutable() {
        if (!((bitField0_ & 0x00000002) == 0x00000002)) {
          previousSessions_ = new java.util.ArrayList(previousSessions_);
          bitField0_ |= 0x00000002;
         }
      }

      private com.google.protobuf.RepeatedFieldBuilder<
          org.whispersystems.libsignal.state.StorageProtos.SessionStructure, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Builder, org.whispersystems.libsignal.state.StorageProtos.SessionStructureOrBuilder> previousSessionsBuilder_;

      /**
       * repeated .textsecure.SessionStructure previousSessions = 2;
       */
      public java.util.List getPreviousSessionsList() {
        if (previousSessionsBuilder_ == null) {
          return java.util.Collections.unmodifiableList(previousSessions_);
        } else {
          return previousSessionsBuilder_.getMessageList();
        }
      }
      /**
       * repeated .textsecure.SessionStructure previousSessions = 2;
       */
      public int getPreviousSessionsCount() {
        if (previousSessionsBuilder_ == null) {
          return previousSessions_.size();
        } else {
          return previousSessionsBuilder_.getCount();
        }
      }
      /**
       * repeated .textsecure.SessionStructure previousSessions = 2;
       */
      public org.whispersystems.libsignal.state.StorageProtos.SessionStructure getPreviousSessions(int index) {
        if (previousSessionsBuilder_ == null) {
          return previousSessions_.get(index);
        } else {
          return previousSessionsBuilder_.getMessage(index);
        }
      }
      /**
       * repeated .textsecure.SessionStructure previousSessions = 2;
       */
      public Builder setPreviousSessions(
          int index, org.whispersystems.libsignal.state.StorageProtos.SessionStructure value) {
        if (previousSessionsBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensurePreviousSessionsIsMutable();
          previousSessions_.set(index, value);
          onChanged();
        } else {
          previousSessionsBuilder_.setMessage(index, value);
        }
        return this;
      }
      /**
       * repeated .textsecure.SessionStructure previousSessions = 2;
       */
      public Builder setPreviousSessions(
          int index, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Builder builderForValue) {
        if (previousSessionsBuilder_ == null) {
          ensurePreviousSessionsIsMutable();
          previousSessions_.set(index, builderForValue.build());
          onChanged();
        } else {
          previousSessionsBuilder_.setMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * repeated .textsecure.SessionStructure previousSessions = 2;
       */
      public Builder addPreviousSessions(org.whispersystems.libsignal.state.StorageProtos.SessionStructure value) {
        if (previousSessionsBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensurePreviousSessionsIsMutable();
          previousSessions_.add(value);
          onChanged();
        } else {
          previousSessionsBuilder_.addMessage(value);
        }
        return this;
      }
      /**
       * repeated .textsecure.SessionStructure previousSessions = 2;
       */
      public Builder addPreviousSessions(
          int index, org.whispersystems.libsignal.state.StorageProtos.SessionStructure value) {
        if (previousSessionsBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensurePreviousSessionsIsMutable();
          previousSessions_.add(index, value);
          onChanged();
        } else {
          previousSessionsBuilder_.addMessage(index, value);
        }
        return this;
      }
      /**
       * repeated .textsecure.SessionStructure previousSessions = 2;
       */
      public Builder addPreviousSessions(
          org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Builder builderForValue) {
        if (previousSessionsBuilder_ == null) {
          ensurePreviousSessionsIsMutable();
          previousSessions_.add(builderForValue.build());
          onChanged();
        } else {
          previousSessionsBuilder_.addMessage(builderForValue.build());
        }
        return this;
      }
      /**
       * repeated .textsecure.SessionStructure previousSessions = 2;
       */
      public Builder addPreviousSessions(
          int index, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Builder builderForValue) {
        if (previousSessionsBuilder_ == null) {
          ensurePreviousSessionsIsMutable();
          previousSessions_.add(index, builderForValue.build());
          onChanged();
        } else {
          previousSessionsBuilder_.addMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * repeated .textsecure.SessionStructure previousSessions = 2;
       */
      public Builder addAllPreviousSessions(
          java.lang.Iterable values) {
        if (previousSessionsBuilder_ == null) {
          ensurePreviousSessionsIsMutable();
          super.addAll(values, previousSessions_);
          onChanged();
        } else {
          previousSessionsBuilder_.addAllMessages(values);
        }
        return this;
      }
      /**
       * repeated .textsecure.SessionStructure previousSessions = 2;
       */
      public Builder clearPreviousSessions() {
        if (previousSessionsBuilder_ == null) {
          previousSessions_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000002);
          onChanged();
        } else {
          previousSessionsBuilder_.clear();
        }
        return this;
      }
      /**
       * repeated .textsecure.SessionStructure previousSessions = 2;
       */
      public Builder removePreviousSessions(int index) {
        if (previousSessionsBuilder_ == null) {
          ensurePreviousSessionsIsMutable();
          previousSessions_.remove(index);
          onChanged();
        } else {
          previousSessionsBuilder_.remove(index);
        }
        return this;
      }
      /**
       * repeated .textsecure.SessionStructure previousSessions = 2;
       */
      public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Builder getPreviousSessionsBuilder(
          int index) {
        return getPreviousSessionsFieldBuilder().getBuilder(index);
      }
      /**
       * repeated .textsecure.SessionStructure previousSessions = 2;
       */
      public org.whispersystems.libsignal.state.StorageProtos.SessionStructureOrBuilder getPreviousSessionsOrBuilder(
          int index) {
        if (previousSessionsBuilder_ == null) {
          return previousSessions_.get(index);  } else {
          return previousSessionsBuilder_.getMessageOrBuilder(index);
        }
      }
      /**
       * repeated .textsecure.SessionStructure previousSessions = 2;
       */
      public java.util.List 
           getPreviousSessionsOrBuilderList() {
        if (previousSessionsBuilder_ != null) {
          return previousSessionsBuilder_.getMessageOrBuilderList();
        } else {
          return java.util.Collections.unmodifiableList(previousSessions_);
        }
      }
      /**
       * repeated .textsecure.SessionStructure previousSessions = 2;
       */
      public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Builder addPreviousSessionsBuilder() {
        return getPreviousSessionsFieldBuilder().addBuilder(
            org.whispersystems.libsignal.state.StorageProtos.SessionStructure.getDefaultInstance());
      }
      /**
       * repeated .textsecure.SessionStructure previousSessions = 2;
       */
      public org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Builder addPreviousSessionsBuilder(
          int index) {
        return getPreviousSessionsFieldBuilder().addBuilder(
            index, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.getDefaultInstance());
      }
      /**
       * repeated .textsecure.SessionStructure previousSessions = 2;
       */
      public java.util.List 
           getPreviousSessionsBuilderList() {
        return getPreviousSessionsFieldBuilder().getBuilderList();
      }
      private com.google.protobuf.RepeatedFieldBuilder<
          org.whispersystems.libsignal.state.StorageProtos.SessionStructure, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Builder, org.whispersystems.libsignal.state.StorageProtos.SessionStructureOrBuilder> 
          getPreviousSessionsFieldBuilder() {
        if (previousSessionsBuilder_ == null) {
          previousSessionsBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
              org.whispersystems.libsignal.state.StorageProtos.SessionStructure, org.whispersystems.libsignal.state.StorageProtos.SessionStructure.Builder, org.whispersystems.libsignal.state.StorageProtos.SessionStructureOrBuilder>(
                  previousSessions_,
                  ((bitField0_ & 0x00000002) == 0x00000002),
                  getParentForChildren(),
                  isClean());
          previousSessions_ = null;
        }
        return previousSessionsBuilder_;
      }

      // @@protoc_insertion_point(builder_scope:textsecure.RecordStructure)
    }

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

    // @@protoc_insertion_point(class_scope:textsecure.RecordStructure)
  }

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

    // optional uint32 id = 1;
    /**
     * optional uint32 id = 1;
     */
    boolean hasId();
    /**
     * optional uint32 id = 1;
     */
    int getId();

    // optional bytes publicKey = 2;
    /**
     * optional bytes publicKey = 2;
     */
    boolean hasPublicKey();
    /**
     * optional bytes publicKey = 2;
     */
    com.google.protobuf.ByteString getPublicKey();

    // optional bytes privateKey = 3;
    /**
     * optional bytes privateKey = 3;
     */
    boolean hasPrivateKey();
    /**
     * optional bytes privateKey = 3;
     */
    com.google.protobuf.ByteString getPrivateKey();
  }
  /**
   * Protobuf type {@code textsecure.PreKeyRecordStructure}
   */
  public static final class PreKeyRecordStructure extends
      com.google.protobuf.GeneratedMessage
      implements PreKeyRecordStructureOrBuilder {
    // Use PreKeyRecordStructure.newBuilder() to construct.
    private PreKeyRecordStructure(com.google.protobuf.GeneratedMessage.Builder builder) {
      super(builder);
      this.unknownFields = builder.getUnknownFields();
    }
    private PreKeyRecordStructure(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

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

    public PreKeyRecordStructure getDefaultInstanceForType() {
      return defaultInstance;
    }

    private final com.google.protobuf.UnknownFieldSet unknownFields;
    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
      return this.unknownFields;
    }
    private PreKeyRecordStructure(
        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;
              id_ = input.readUInt32();
              break;
            }
            case 18: {
              bitField0_ |= 0x00000002;
              publicKey_ = input.readBytes();
              break;
            }
            case 26: {
              bitField0_ |= 0x00000004;
              privateKey_ = input.readBytes();
              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 org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_PreKeyRecordStructure_descriptor;
    }

    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_PreKeyRecordStructure_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              org.whispersystems.libsignal.state.StorageProtos.PreKeyRecordStructure.class, org.whispersystems.libsignal.state.StorageProtos.PreKeyRecordStructure.Builder.class);
    }

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

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

    private int bitField0_;
    // optional uint32 id = 1;
    public static final int ID_FIELD_NUMBER = 1;
    private int id_;
    /**
     * optional uint32 id = 1;
     */
    public boolean hasId() {
      return ((bitField0_ & 0x00000001) == 0x00000001);
    }
    /**
     * optional uint32 id = 1;
     */
    public int getId() {
      return id_;
    }

    // optional bytes publicKey = 2;
    public static final int PUBLICKEY_FIELD_NUMBER = 2;
    private com.google.protobuf.ByteString publicKey_;
    /**
     * optional bytes publicKey = 2;
     */
    public boolean hasPublicKey() {
      return ((bitField0_ & 0x00000002) == 0x00000002);
    }
    /**
     * optional bytes publicKey = 2;
     */
    public com.google.protobuf.ByteString getPublicKey() {
      return publicKey_;
    }

    // optional bytes privateKey = 3;
    public static final int PRIVATEKEY_FIELD_NUMBER = 3;
    private com.google.protobuf.ByteString privateKey_;
    /**
     * optional bytes privateKey = 3;
     */
    public boolean hasPrivateKey() {
      return ((bitField0_ & 0x00000004) == 0x00000004);
    }
    /**
     * optional bytes privateKey = 3;
     */
    public com.google.protobuf.ByteString getPrivateKey() {
      return privateKey_;
    }

    private void initFields() {
      id_ = 0;
      publicKey_ = com.google.protobuf.ByteString.EMPTY;
      privateKey_ = com.google.protobuf.ByteString.EMPTY;
    }
    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.writeUInt32(1, id_);
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        output.writeBytes(2, publicKey_);
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        output.writeBytes(3, privateKey_);
      }
      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
          .computeUInt32Size(1, id_);
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(2, publicKey_);
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(3, privateKey_);
      }
      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 org.whispersystems.libsignal.state.StorageProtos.PreKeyRecordStructure parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.PreKeyRecordStructure parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.PreKeyRecordStructure parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.PreKeyRecordStructure parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.PreKeyRecordStructure parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.PreKeyRecordStructure parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.PreKeyRecordStructure parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.PreKeyRecordStructure parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input, extensionRegistry);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.PreKeyRecordStructure parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.PreKeyRecordStructure 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(org.whispersystems.libsignal.state.StorageProtos.PreKeyRecordStructure 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 textsecure.PreKeyRecordStructure}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessage.Builder
       implements org.whispersystems.libsignal.state.StorageProtos.PreKeyRecordStructureOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_PreKeyRecordStructure_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_PreKeyRecordStructure_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.whispersystems.libsignal.state.StorageProtos.PreKeyRecordStructure.class, org.whispersystems.libsignal.state.StorageProtos.PreKeyRecordStructure.Builder.class);
      }

      // Construct using org.whispersystems.libsignal.state.StorageProtos.PreKeyRecordStructure.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();
        id_ = 0;
        bitField0_ = (bitField0_ & ~0x00000001);
        publicKey_ = com.google.protobuf.ByteString.EMPTY;
        bitField0_ = (bitField0_ & ~0x00000002);
        privateKey_ = com.google.protobuf.ByteString.EMPTY;
        bitField0_ = (bitField0_ & ~0x00000004);
        return this;
      }

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

      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_PreKeyRecordStructure_descriptor;
      }

      public org.whispersystems.libsignal.state.StorageProtos.PreKeyRecordStructure getDefaultInstanceForType() {
        return org.whispersystems.libsignal.state.StorageProtos.PreKeyRecordStructure.getDefaultInstance();
      }

      public org.whispersystems.libsignal.state.StorageProtos.PreKeyRecordStructure build() {
        org.whispersystems.libsignal.state.StorageProtos.PreKeyRecordStructure result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      public org.whispersystems.libsignal.state.StorageProtos.PreKeyRecordStructure buildPartial() {
        org.whispersystems.libsignal.state.StorageProtos.PreKeyRecordStructure result = new org.whispersystems.libsignal.state.StorageProtos.PreKeyRecordStructure(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
          to_bitField0_ |= 0x00000001;
        }
        result.id_ = id_;
        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
          to_bitField0_ |= 0x00000002;
        }
        result.publicKey_ = publicKey_;
        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
          to_bitField0_ |= 0x00000004;
        }
        result.privateKey_ = privateKey_;
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof org.whispersystems.libsignal.state.StorageProtos.PreKeyRecordStructure) {
          return mergeFrom((org.whispersystems.libsignal.state.StorageProtos.PreKeyRecordStructure)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(org.whispersystems.libsignal.state.StorageProtos.PreKeyRecordStructure other) {
        if (other == org.whispersystems.libsignal.state.StorageProtos.PreKeyRecordStructure.getDefaultInstance()) return this;
        if (other.hasId()) {
          setId(other.getId());
        }
        if (other.hasPublicKey()) {
          setPublicKey(other.getPublicKey());
        }
        if (other.hasPrivateKey()) {
          setPrivateKey(other.getPrivateKey());
        }
        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 {
        org.whispersystems.libsignal.state.StorageProtos.PreKeyRecordStructure parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (org.whispersystems.libsignal.state.StorageProtos.PreKeyRecordStructure) e.getUnfinishedMessage();
          throw e;
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      // optional uint32 id = 1;
      private int id_ ;
      /**
       * optional uint32 id = 1;
       */
      public boolean hasId() {
        return ((bitField0_ & 0x00000001) == 0x00000001);
      }
      /**
       * optional uint32 id = 1;
       */
      public int getId() {
        return id_;
      }
      /**
       * optional uint32 id = 1;
       */
      public Builder setId(int value) {
        bitField0_ |= 0x00000001;
        id_ = value;
        onChanged();
        return this;
      }
      /**
       * optional uint32 id = 1;
       */
      public Builder clearId() {
        bitField0_ = (bitField0_ & ~0x00000001);
        id_ = 0;
        onChanged();
        return this;
      }

      // optional bytes publicKey = 2;
      private com.google.protobuf.ByteString publicKey_ = com.google.protobuf.ByteString.EMPTY;
      /**
       * optional bytes publicKey = 2;
       */
      public boolean hasPublicKey() {
        return ((bitField0_ & 0x00000002) == 0x00000002);
      }
      /**
       * optional bytes publicKey = 2;
       */
      public com.google.protobuf.ByteString getPublicKey() {
        return publicKey_;
      }
      /**
       * optional bytes publicKey = 2;
       */
      public Builder setPublicKey(com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
        publicKey_ = value;
        onChanged();
        return this;
      }
      /**
       * optional bytes publicKey = 2;
       */
      public Builder clearPublicKey() {
        bitField0_ = (bitField0_ & ~0x00000002);
        publicKey_ = getDefaultInstance().getPublicKey();
        onChanged();
        return this;
      }

      // optional bytes privateKey = 3;
      private com.google.protobuf.ByteString privateKey_ = com.google.protobuf.ByteString.EMPTY;
      /**
       * optional bytes privateKey = 3;
       */
      public boolean hasPrivateKey() {
        return ((bitField0_ & 0x00000004) == 0x00000004);
      }
      /**
       * optional bytes privateKey = 3;
       */
      public com.google.protobuf.ByteString getPrivateKey() {
        return privateKey_;
      }
      /**
       * optional bytes privateKey = 3;
       */
      public Builder setPrivateKey(com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        privateKey_ = value;
        onChanged();
        return this;
      }
      /**
       * optional bytes privateKey = 3;
       */
      public Builder clearPrivateKey() {
        bitField0_ = (bitField0_ & ~0x00000004);
        privateKey_ = getDefaultInstance().getPrivateKey();
        onChanged();
        return this;
      }

      // @@protoc_insertion_point(builder_scope:textsecure.PreKeyRecordStructure)
    }

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

    // @@protoc_insertion_point(class_scope:textsecure.PreKeyRecordStructure)
  }

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

    // optional uint32 id = 1;
    /**
     * optional uint32 id = 1;
     */
    boolean hasId();
    /**
     * optional uint32 id = 1;
     */
    int getId();

    // optional bytes publicKey = 2;
    /**
     * optional bytes publicKey = 2;
     */
    boolean hasPublicKey();
    /**
     * optional bytes publicKey = 2;
     */
    com.google.protobuf.ByteString getPublicKey();

    // optional bytes privateKey = 3;
    /**
     * optional bytes privateKey = 3;
     */
    boolean hasPrivateKey();
    /**
     * optional bytes privateKey = 3;
     */
    com.google.protobuf.ByteString getPrivateKey();

    // optional bytes signature = 4;
    /**
     * optional bytes signature = 4;
     */
    boolean hasSignature();
    /**
     * optional bytes signature = 4;
     */
    com.google.protobuf.ByteString getSignature();

    // optional fixed64 timestamp = 5;
    /**
     * optional fixed64 timestamp = 5;
     */
    boolean hasTimestamp();
    /**
     * optional fixed64 timestamp = 5;
     */
    long getTimestamp();
  }
  /**
   * Protobuf type {@code textsecure.SignedPreKeyRecordStructure}
   */
  public static final class SignedPreKeyRecordStructure extends
      com.google.protobuf.GeneratedMessage
      implements SignedPreKeyRecordStructureOrBuilder {
    // Use SignedPreKeyRecordStructure.newBuilder() to construct.
    private SignedPreKeyRecordStructure(com.google.protobuf.GeneratedMessage.Builder builder) {
      super(builder);
      this.unknownFields = builder.getUnknownFields();
    }
    private SignedPreKeyRecordStructure(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

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

    public SignedPreKeyRecordStructure getDefaultInstanceForType() {
      return defaultInstance;
    }

    private final com.google.protobuf.UnknownFieldSet unknownFields;
    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
      return this.unknownFields;
    }
    private SignedPreKeyRecordStructure(
        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;
              id_ = input.readUInt32();
              break;
            }
            case 18: {
              bitField0_ |= 0x00000002;
              publicKey_ = input.readBytes();
              break;
            }
            case 26: {
              bitField0_ |= 0x00000004;
              privateKey_ = input.readBytes();
              break;
            }
            case 34: {
              bitField0_ |= 0x00000008;
              signature_ = input.readBytes();
              break;
            }
            case 41: {
              bitField0_ |= 0x00000010;
              timestamp_ = input.readFixed64();
              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 org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SignedPreKeyRecordStructure_descriptor;
    }

    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SignedPreKeyRecordStructure_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              org.whispersystems.libsignal.state.StorageProtos.SignedPreKeyRecordStructure.class, org.whispersystems.libsignal.state.StorageProtos.SignedPreKeyRecordStructure.Builder.class);
    }

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

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

    private int bitField0_;
    // optional uint32 id = 1;
    public static final int ID_FIELD_NUMBER = 1;
    private int id_;
    /**
     * optional uint32 id = 1;
     */
    public boolean hasId() {
      return ((bitField0_ & 0x00000001) == 0x00000001);
    }
    /**
     * optional uint32 id = 1;
     */
    public int getId() {
      return id_;
    }

    // optional bytes publicKey = 2;
    public static final int PUBLICKEY_FIELD_NUMBER = 2;
    private com.google.protobuf.ByteString publicKey_;
    /**
     * optional bytes publicKey = 2;
     */
    public boolean hasPublicKey() {
      return ((bitField0_ & 0x00000002) == 0x00000002);
    }
    /**
     * optional bytes publicKey = 2;
     */
    public com.google.protobuf.ByteString getPublicKey() {
      return publicKey_;
    }

    // optional bytes privateKey = 3;
    public static final int PRIVATEKEY_FIELD_NUMBER = 3;
    private com.google.protobuf.ByteString privateKey_;
    /**
     * optional bytes privateKey = 3;
     */
    public boolean hasPrivateKey() {
      return ((bitField0_ & 0x00000004) == 0x00000004);
    }
    /**
     * optional bytes privateKey = 3;
     */
    public com.google.protobuf.ByteString getPrivateKey() {
      return privateKey_;
    }

    // optional bytes signature = 4;
    public static final int SIGNATURE_FIELD_NUMBER = 4;
    private com.google.protobuf.ByteString signature_;
    /**
     * optional bytes signature = 4;
     */
    public boolean hasSignature() {
      return ((bitField0_ & 0x00000008) == 0x00000008);
    }
    /**
     * optional bytes signature = 4;
     */
    public com.google.protobuf.ByteString getSignature() {
      return signature_;
    }

    // optional fixed64 timestamp = 5;
    public static final int TIMESTAMP_FIELD_NUMBER = 5;
    private long timestamp_;
    /**
     * optional fixed64 timestamp = 5;
     */
    public boolean hasTimestamp() {
      return ((bitField0_ & 0x00000010) == 0x00000010);
    }
    /**
     * optional fixed64 timestamp = 5;
     */
    public long getTimestamp() {
      return timestamp_;
    }

    private void initFields() {
      id_ = 0;
      publicKey_ = com.google.protobuf.ByteString.EMPTY;
      privateKey_ = com.google.protobuf.ByteString.EMPTY;
      signature_ = com.google.protobuf.ByteString.EMPTY;
      timestamp_ = 0L;
    }
    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.writeUInt32(1, id_);
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        output.writeBytes(2, publicKey_);
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        output.writeBytes(3, privateKey_);
      }
      if (((bitField0_ & 0x00000008) == 0x00000008)) {
        output.writeBytes(4, signature_);
      }
      if (((bitField0_ & 0x00000010) == 0x00000010)) {
        output.writeFixed64(5, timestamp_);
      }
      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
          .computeUInt32Size(1, id_);
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(2, publicKey_);
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(3, privateKey_);
      }
      if (((bitField0_ & 0x00000008) == 0x00000008)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(4, signature_);
      }
      if (((bitField0_ & 0x00000010) == 0x00000010)) {
        size += com.google.protobuf.CodedOutputStream
          .computeFixed64Size(5, timestamp_);
      }
      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 org.whispersystems.libsignal.state.StorageProtos.SignedPreKeyRecordStructure parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.SignedPreKeyRecordStructure parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.SignedPreKeyRecordStructure parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.SignedPreKeyRecordStructure parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.SignedPreKeyRecordStructure parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.SignedPreKeyRecordStructure parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.SignedPreKeyRecordStructure parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.SignedPreKeyRecordStructure parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input, extensionRegistry);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.SignedPreKeyRecordStructure parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.SignedPreKeyRecordStructure 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(org.whispersystems.libsignal.state.StorageProtos.SignedPreKeyRecordStructure 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 textsecure.SignedPreKeyRecordStructure}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessage.Builder
       implements org.whispersystems.libsignal.state.StorageProtos.SignedPreKeyRecordStructureOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SignedPreKeyRecordStructure_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SignedPreKeyRecordStructure_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.whispersystems.libsignal.state.StorageProtos.SignedPreKeyRecordStructure.class, org.whispersystems.libsignal.state.StorageProtos.SignedPreKeyRecordStructure.Builder.class);
      }

      // Construct using org.whispersystems.libsignal.state.StorageProtos.SignedPreKeyRecordStructure.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();
        id_ = 0;
        bitField0_ = (bitField0_ & ~0x00000001);
        publicKey_ = com.google.protobuf.ByteString.EMPTY;
        bitField0_ = (bitField0_ & ~0x00000002);
        privateKey_ = com.google.protobuf.ByteString.EMPTY;
        bitField0_ = (bitField0_ & ~0x00000004);
        signature_ = com.google.protobuf.ByteString.EMPTY;
        bitField0_ = (bitField0_ & ~0x00000008);
        timestamp_ = 0L;
        bitField0_ = (bitField0_ & ~0x00000010);
        return this;
      }

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

      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SignedPreKeyRecordStructure_descriptor;
      }

      public org.whispersystems.libsignal.state.StorageProtos.SignedPreKeyRecordStructure getDefaultInstanceForType() {
        return org.whispersystems.libsignal.state.StorageProtos.SignedPreKeyRecordStructure.getDefaultInstance();
      }

      public org.whispersystems.libsignal.state.StorageProtos.SignedPreKeyRecordStructure build() {
        org.whispersystems.libsignal.state.StorageProtos.SignedPreKeyRecordStructure result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      public org.whispersystems.libsignal.state.StorageProtos.SignedPreKeyRecordStructure buildPartial() {
        org.whispersystems.libsignal.state.StorageProtos.SignedPreKeyRecordStructure result = new org.whispersystems.libsignal.state.StorageProtos.SignedPreKeyRecordStructure(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
          to_bitField0_ |= 0x00000001;
        }
        result.id_ = id_;
        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
          to_bitField0_ |= 0x00000002;
        }
        result.publicKey_ = publicKey_;
        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
          to_bitField0_ |= 0x00000004;
        }
        result.privateKey_ = privateKey_;
        if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
          to_bitField0_ |= 0x00000008;
        }
        result.signature_ = signature_;
        if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
          to_bitField0_ |= 0x00000010;
        }
        result.timestamp_ = timestamp_;
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof org.whispersystems.libsignal.state.StorageProtos.SignedPreKeyRecordStructure) {
          return mergeFrom((org.whispersystems.libsignal.state.StorageProtos.SignedPreKeyRecordStructure)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(org.whispersystems.libsignal.state.StorageProtos.SignedPreKeyRecordStructure other) {
        if (other == org.whispersystems.libsignal.state.StorageProtos.SignedPreKeyRecordStructure.getDefaultInstance()) return this;
        if (other.hasId()) {
          setId(other.getId());
        }
        if (other.hasPublicKey()) {
          setPublicKey(other.getPublicKey());
        }
        if (other.hasPrivateKey()) {
          setPrivateKey(other.getPrivateKey());
        }
        if (other.hasSignature()) {
          setSignature(other.getSignature());
        }
        if (other.hasTimestamp()) {
          setTimestamp(other.getTimestamp());
        }
        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 {
        org.whispersystems.libsignal.state.StorageProtos.SignedPreKeyRecordStructure parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (org.whispersystems.libsignal.state.StorageProtos.SignedPreKeyRecordStructure) e.getUnfinishedMessage();
          throw e;
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      // optional uint32 id = 1;
      private int id_ ;
      /**
       * optional uint32 id = 1;
       */
      public boolean hasId() {
        return ((bitField0_ & 0x00000001) == 0x00000001);
      }
      /**
       * optional uint32 id = 1;
       */
      public int getId() {
        return id_;
      }
      /**
       * optional uint32 id = 1;
       */
      public Builder setId(int value) {
        bitField0_ |= 0x00000001;
        id_ = value;
        onChanged();
        return this;
      }
      /**
       * optional uint32 id = 1;
       */
      public Builder clearId() {
        bitField0_ = (bitField0_ & ~0x00000001);
        id_ = 0;
        onChanged();
        return this;
      }

      // optional bytes publicKey = 2;
      private com.google.protobuf.ByteString publicKey_ = com.google.protobuf.ByteString.EMPTY;
      /**
       * optional bytes publicKey = 2;
       */
      public boolean hasPublicKey() {
        return ((bitField0_ & 0x00000002) == 0x00000002);
      }
      /**
       * optional bytes publicKey = 2;
       */
      public com.google.protobuf.ByteString getPublicKey() {
        return publicKey_;
      }
      /**
       * optional bytes publicKey = 2;
       */
      public Builder setPublicKey(com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
        publicKey_ = value;
        onChanged();
        return this;
      }
      /**
       * optional bytes publicKey = 2;
       */
      public Builder clearPublicKey() {
        bitField0_ = (bitField0_ & ~0x00000002);
        publicKey_ = getDefaultInstance().getPublicKey();
        onChanged();
        return this;
      }

      // optional bytes privateKey = 3;
      private com.google.protobuf.ByteString privateKey_ = com.google.protobuf.ByteString.EMPTY;
      /**
       * optional bytes privateKey = 3;
       */
      public boolean hasPrivateKey() {
        return ((bitField0_ & 0x00000004) == 0x00000004);
      }
      /**
       * optional bytes privateKey = 3;
       */
      public com.google.protobuf.ByteString getPrivateKey() {
        return privateKey_;
      }
      /**
       * optional bytes privateKey = 3;
       */
      public Builder setPrivateKey(com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        privateKey_ = value;
        onChanged();
        return this;
      }
      /**
       * optional bytes privateKey = 3;
       */
      public Builder clearPrivateKey() {
        bitField0_ = (bitField0_ & ~0x00000004);
        privateKey_ = getDefaultInstance().getPrivateKey();
        onChanged();
        return this;
      }

      // optional bytes signature = 4;
      private com.google.protobuf.ByteString signature_ = com.google.protobuf.ByteString.EMPTY;
      /**
       * optional bytes signature = 4;
       */
      public boolean hasSignature() {
        return ((bitField0_ & 0x00000008) == 0x00000008);
      }
      /**
       * optional bytes signature = 4;
       */
      public com.google.protobuf.ByteString getSignature() {
        return signature_;
      }
      /**
       * optional bytes signature = 4;
       */
      public Builder setSignature(com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        signature_ = value;
        onChanged();
        return this;
      }
      /**
       * optional bytes signature = 4;
       */
      public Builder clearSignature() {
        bitField0_ = (bitField0_ & ~0x00000008);
        signature_ = getDefaultInstance().getSignature();
        onChanged();
        return this;
      }

      // optional fixed64 timestamp = 5;
      private long timestamp_ ;
      /**
       * optional fixed64 timestamp = 5;
       */
      public boolean hasTimestamp() {
        return ((bitField0_ & 0x00000010) == 0x00000010);
      }
      /**
       * optional fixed64 timestamp = 5;
       */
      public long getTimestamp() {
        return timestamp_;
      }
      /**
       * optional fixed64 timestamp = 5;
       */
      public Builder setTimestamp(long value) {
        bitField0_ |= 0x00000010;
        timestamp_ = value;
        onChanged();
        return this;
      }
      /**
       * optional fixed64 timestamp = 5;
       */
      public Builder clearTimestamp() {
        bitField0_ = (bitField0_ & ~0x00000010);
        timestamp_ = 0L;
        onChanged();
        return this;
      }

      // @@protoc_insertion_point(builder_scope:textsecure.SignedPreKeyRecordStructure)
    }

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

    // @@protoc_insertion_point(class_scope:textsecure.SignedPreKeyRecordStructure)
  }

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

    // optional bytes publicKey = 1;
    /**
     * optional bytes publicKey = 1;
     */
    boolean hasPublicKey();
    /**
     * optional bytes publicKey = 1;
     */
    com.google.protobuf.ByteString getPublicKey();

    // optional bytes privateKey = 2;
    /**
     * optional bytes privateKey = 2;
     */
    boolean hasPrivateKey();
    /**
     * optional bytes privateKey = 2;
     */
    com.google.protobuf.ByteString getPrivateKey();
  }
  /**
   * Protobuf type {@code textsecure.IdentityKeyPairStructure}
   */
  public static final class IdentityKeyPairStructure extends
      com.google.protobuf.GeneratedMessage
      implements IdentityKeyPairStructureOrBuilder {
    // Use IdentityKeyPairStructure.newBuilder() to construct.
    private IdentityKeyPairStructure(com.google.protobuf.GeneratedMessage.Builder builder) {
      super(builder);
      this.unknownFields = builder.getUnknownFields();
    }
    private IdentityKeyPairStructure(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

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

    public IdentityKeyPairStructure getDefaultInstanceForType() {
      return defaultInstance;
    }

    private final com.google.protobuf.UnknownFieldSet unknownFields;
    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
      return this.unknownFields;
    }
    private IdentityKeyPairStructure(
        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;
              publicKey_ = input.readBytes();
              break;
            }
            case 18: {
              bitField0_ |= 0x00000002;
              privateKey_ = input.readBytes();
              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 org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_IdentityKeyPairStructure_descriptor;
    }

    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_IdentityKeyPairStructure_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              org.whispersystems.libsignal.state.StorageProtos.IdentityKeyPairStructure.class, org.whispersystems.libsignal.state.StorageProtos.IdentityKeyPairStructure.Builder.class);
    }

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

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

    private int bitField0_;
    // optional bytes publicKey = 1;
    public static final int PUBLICKEY_FIELD_NUMBER = 1;
    private com.google.protobuf.ByteString publicKey_;
    /**
     * optional bytes publicKey = 1;
     */
    public boolean hasPublicKey() {
      return ((bitField0_ & 0x00000001) == 0x00000001);
    }
    /**
     * optional bytes publicKey = 1;
     */
    public com.google.protobuf.ByteString getPublicKey() {
      return publicKey_;
    }

    // optional bytes privateKey = 2;
    public static final int PRIVATEKEY_FIELD_NUMBER = 2;
    private com.google.protobuf.ByteString privateKey_;
    /**
     * optional bytes privateKey = 2;
     */
    public boolean hasPrivateKey() {
      return ((bitField0_ & 0x00000002) == 0x00000002);
    }
    /**
     * optional bytes privateKey = 2;
     */
    public com.google.protobuf.ByteString getPrivateKey() {
      return privateKey_;
    }

    private void initFields() {
      publicKey_ = com.google.protobuf.ByteString.EMPTY;
      privateKey_ = com.google.protobuf.ByteString.EMPTY;
    }
    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, publicKey_);
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        output.writeBytes(2, privateKey_);
      }
      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, publicKey_);
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(2, privateKey_);
      }
      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 org.whispersystems.libsignal.state.StorageProtos.IdentityKeyPairStructure parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.IdentityKeyPairStructure parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.IdentityKeyPairStructure parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.IdentityKeyPairStructure parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.IdentityKeyPairStructure parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.IdentityKeyPairStructure parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.IdentityKeyPairStructure parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.IdentityKeyPairStructure parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input, extensionRegistry);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.IdentityKeyPairStructure parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.IdentityKeyPairStructure 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(org.whispersystems.libsignal.state.StorageProtos.IdentityKeyPairStructure 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 textsecure.IdentityKeyPairStructure}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessage.Builder
       implements org.whispersystems.libsignal.state.StorageProtos.IdentityKeyPairStructureOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_IdentityKeyPairStructure_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_IdentityKeyPairStructure_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.whispersystems.libsignal.state.StorageProtos.IdentityKeyPairStructure.class, org.whispersystems.libsignal.state.StorageProtos.IdentityKeyPairStructure.Builder.class);
      }

      // Construct using org.whispersystems.libsignal.state.StorageProtos.IdentityKeyPairStructure.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();
        publicKey_ = com.google.protobuf.ByteString.EMPTY;
        bitField0_ = (bitField0_ & ~0x00000001);
        privateKey_ = com.google.protobuf.ByteString.EMPTY;
        bitField0_ = (bitField0_ & ~0x00000002);
        return this;
      }

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

      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_IdentityKeyPairStructure_descriptor;
      }

      public org.whispersystems.libsignal.state.StorageProtos.IdentityKeyPairStructure getDefaultInstanceForType() {
        return org.whispersystems.libsignal.state.StorageProtos.IdentityKeyPairStructure.getDefaultInstance();
      }

      public org.whispersystems.libsignal.state.StorageProtos.IdentityKeyPairStructure build() {
        org.whispersystems.libsignal.state.StorageProtos.IdentityKeyPairStructure result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      public org.whispersystems.libsignal.state.StorageProtos.IdentityKeyPairStructure buildPartial() {
        org.whispersystems.libsignal.state.StorageProtos.IdentityKeyPairStructure result = new org.whispersystems.libsignal.state.StorageProtos.IdentityKeyPairStructure(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
          to_bitField0_ |= 0x00000001;
        }
        result.publicKey_ = publicKey_;
        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
          to_bitField0_ |= 0x00000002;
        }
        result.privateKey_ = privateKey_;
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof org.whispersystems.libsignal.state.StorageProtos.IdentityKeyPairStructure) {
          return mergeFrom((org.whispersystems.libsignal.state.StorageProtos.IdentityKeyPairStructure)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(org.whispersystems.libsignal.state.StorageProtos.IdentityKeyPairStructure other) {
        if (other == org.whispersystems.libsignal.state.StorageProtos.IdentityKeyPairStructure.getDefaultInstance()) return this;
        if (other.hasPublicKey()) {
          setPublicKey(other.getPublicKey());
        }
        if (other.hasPrivateKey()) {
          setPrivateKey(other.getPrivateKey());
        }
        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 {
        org.whispersystems.libsignal.state.StorageProtos.IdentityKeyPairStructure parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (org.whispersystems.libsignal.state.StorageProtos.IdentityKeyPairStructure) e.getUnfinishedMessage();
          throw e;
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      // optional bytes publicKey = 1;
      private com.google.protobuf.ByteString publicKey_ = com.google.protobuf.ByteString.EMPTY;
      /**
       * optional bytes publicKey = 1;
       */
      public boolean hasPublicKey() {
        return ((bitField0_ & 0x00000001) == 0x00000001);
      }
      /**
       * optional bytes publicKey = 1;
       */
      public com.google.protobuf.ByteString getPublicKey() {
        return publicKey_;
      }
      /**
       * optional bytes publicKey = 1;
       */
      public Builder setPublicKey(com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
        publicKey_ = value;
        onChanged();
        return this;
      }
      /**
       * optional bytes publicKey = 1;
       */
      public Builder clearPublicKey() {
        bitField0_ = (bitField0_ & ~0x00000001);
        publicKey_ = getDefaultInstance().getPublicKey();
        onChanged();
        return this;
      }

      // optional bytes privateKey = 2;
      private com.google.protobuf.ByteString privateKey_ = com.google.protobuf.ByteString.EMPTY;
      /**
       * optional bytes privateKey = 2;
       */
      public boolean hasPrivateKey() {
        return ((bitField0_ & 0x00000002) == 0x00000002);
      }
      /**
       * optional bytes privateKey = 2;
       */
      public com.google.protobuf.ByteString getPrivateKey() {
        return privateKey_;
      }
      /**
       * optional bytes privateKey = 2;
       */
      public Builder setPrivateKey(com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
        privateKey_ = value;
        onChanged();
        return this;
      }
      /**
       * optional bytes privateKey = 2;
       */
      public Builder clearPrivateKey() {
        bitField0_ = (bitField0_ & ~0x00000002);
        privateKey_ = getDefaultInstance().getPrivateKey();
        onChanged();
        return this;
      }

      // @@protoc_insertion_point(builder_scope:textsecure.IdentityKeyPairStructure)
    }

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

    // @@protoc_insertion_point(class_scope:textsecure.IdentityKeyPairStructure)
  }

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

    // optional uint32 senderKeyId = 1;
    /**
     * optional uint32 senderKeyId = 1;
     */
    boolean hasSenderKeyId();
    /**
     * optional uint32 senderKeyId = 1;
     */
    int getSenderKeyId();

    // optional .textsecure.SenderKeyStateStructure.SenderChainKey senderChainKey = 2;
    /**
     * optional .textsecure.SenderKeyStateStructure.SenderChainKey senderChainKey = 2;
     */
    boolean hasSenderChainKey();
    /**
     * optional .textsecure.SenderKeyStateStructure.SenderChainKey senderChainKey = 2;
     */
    org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey getSenderChainKey();
    /**
     * optional .textsecure.SenderKeyStateStructure.SenderChainKey senderChainKey = 2;
     */
    org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKeyOrBuilder getSenderChainKeyOrBuilder();

    // optional .textsecure.SenderKeyStateStructure.SenderSigningKey senderSigningKey = 3;
    /**
     * optional .textsecure.SenderKeyStateStructure.SenderSigningKey senderSigningKey = 3;
     */
    boolean hasSenderSigningKey();
    /**
     * optional .textsecure.SenderKeyStateStructure.SenderSigningKey senderSigningKey = 3;
     */
    org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey getSenderSigningKey();
    /**
     * optional .textsecure.SenderKeyStateStructure.SenderSigningKey senderSigningKey = 3;
     */
    org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKeyOrBuilder getSenderSigningKeyOrBuilder();

    // repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4;
    /**
     * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4;
     */
    java.util.List 
        getSenderMessageKeysList();
    /**
     * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4;
     */
    org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey getSenderMessageKeys(int index);
    /**
     * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4;
     */
    int getSenderMessageKeysCount();
    /**
     * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4;
     */
    java.util.List 
        getSenderMessageKeysOrBuilderList();
    /**
     * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4;
     */
    org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKeyOrBuilder getSenderMessageKeysOrBuilder(
        int index);
  }
  /**
   * Protobuf type {@code textsecure.SenderKeyStateStructure}
   */
  public static final class SenderKeyStateStructure extends
      com.google.protobuf.GeneratedMessage
      implements SenderKeyStateStructureOrBuilder {
    // Use SenderKeyStateStructure.newBuilder() to construct.
    private SenderKeyStateStructure(com.google.protobuf.GeneratedMessage.Builder builder) {
      super(builder);
      this.unknownFields = builder.getUnknownFields();
    }
    private SenderKeyStateStructure(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

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

    public SenderKeyStateStructure getDefaultInstanceForType() {
      return defaultInstance;
    }

    private final com.google.protobuf.UnknownFieldSet unknownFields;
    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
      return this.unknownFields;
    }
    private SenderKeyStateStructure(
        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;
              senderKeyId_ = input.readUInt32();
              break;
            }
            case 18: {
              org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey.Builder subBuilder = null;
              if (((bitField0_ & 0x00000002) == 0x00000002)) {
                subBuilder = senderChainKey_.toBuilder();
              }
              senderChainKey_ = input.readMessage(org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(senderChainKey_);
                senderChainKey_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000002;
              break;
            }
            case 26: {
              org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey.Builder subBuilder = null;
              if (((bitField0_ & 0x00000004) == 0x00000004)) {
                subBuilder = senderSigningKey_.toBuilder();
              }
              senderSigningKey_ = input.readMessage(org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(senderSigningKey_);
                senderSigningKey_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000004;
              break;
            }
            case 34: {
              if (!((mutable_bitField0_ & 0x00000008) == 0x00000008)) {
                senderMessageKeys_ = new java.util.ArrayList();
                mutable_bitField0_ |= 0x00000008;
              }
              senderMessageKeys_.add(input.readMessage(org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey.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_ & 0x00000008) == 0x00000008)) {
          senderMessageKeys_ = java.util.Collections.unmodifiableList(senderMessageKeys_);
        }
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyStateStructure_descriptor;
    }

    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyStateStructure_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.class, org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.Builder.class);
    }

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

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

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

      // optional uint32 iteration = 1;
      /**
       * optional uint32 iteration = 1;
       */
      boolean hasIteration();
      /**
       * optional uint32 iteration = 1;
       */
      int getIteration();

      // optional bytes seed = 2;
      /**
       * optional bytes seed = 2;
       */
      boolean hasSeed();
      /**
       * optional bytes seed = 2;
       */
      com.google.protobuf.ByteString getSeed();
    }
    /**
     * Protobuf type {@code textsecure.SenderKeyStateStructure.SenderChainKey}
     */
    public static final class SenderChainKey extends
        com.google.protobuf.GeneratedMessage
        implements SenderChainKeyOrBuilder {
      // Use SenderChainKey.newBuilder() to construct.
      private SenderChainKey(com.google.protobuf.GeneratedMessage.Builder builder) {
        super(builder);
        this.unknownFields = builder.getUnknownFields();
      }
      private SenderChainKey(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

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

      public SenderChainKey getDefaultInstanceForType() {
        return defaultInstance;
      }

      private final com.google.protobuf.UnknownFieldSet unknownFields;
      @java.lang.Override
      public final com.google.protobuf.UnknownFieldSet
          getUnknownFields() {
        return this.unknownFields;
      }
      private SenderChainKey(
          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;
                iteration_ = input.readUInt32();
                break;
              }
              case 18: {
                bitField0_ |= 0x00000002;
                seed_ = input.readBytes();
                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 org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyStateStructure_SenderChainKey_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyStateStructure_SenderChainKey_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey.class, org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey.Builder.class);
      }

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

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

      private int bitField0_;
      // optional uint32 iteration = 1;
      public static final int ITERATION_FIELD_NUMBER = 1;
      private int iteration_;
      /**
       * optional uint32 iteration = 1;
       */
      public boolean hasIteration() {
        return ((bitField0_ & 0x00000001) == 0x00000001);
      }
      /**
       * optional uint32 iteration = 1;
       */
      public int getIteration() {
        return iteration_;
      }

      // optional bytes seed = 2;
      public static final int SEED_FIELD_NUMBER = 2;
      private com.google.protobuf.ByteString seed_;
      /**
       * optional bytes seed = 2;
       */
      public boolean hasSeed() {
        return ((bitField0_ & 0x00000002) == 0x00000002);
      }
      /**
       * optional bytes seed = 2;
       */
      public com.google.protobuf.ByteString getSeed() {
        return seed_;
      }

      private void initFields() {
        iteration_ = 0;
        seed_ = com.google.protobuf.ByteString.EMPTY;
      }
      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.writeUInt32(1, iteration_);
        }
        if (((bitField0_ & 0x00000002) == 0x00000002)) {
          output.writeBytes(2, seed_);
        }
        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
            .computeUInt32Size(1, iteration_);
        }
        if (((bitField0_ & 0x00000002) == 0x00000002)) {
          size += com.google.protobuf.CodedOutputStream
            .computeBytesSize(2, seed_);
        }
        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 org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey parseFrom(
          com.google.protobuf.ByteString data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey parseFrom(
          com.google.protobuf.ByteString data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey parseFrom(byte[] data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey parseFrom(
          byte[] data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey parseFrom(java.io.InputStream input)
          throws java.io.IOException {
        return PARSER.parseFrom(input);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey parseFrom(
          java.io.InputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        return PARSER.parseFrom(input, extensionRegistry);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey parseDelimitedFrom(java.io.InputStream input)
          throws java.io.IOException {
        return PARSER.parseDelimitedFrom(input);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey parseDelimitedFrom(
          java.io.InputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        return PARSER.parseDelimitedFrom(input, extensionRegistry);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey parseFrom(
          com.google.protobuf.CodedInputStream input)
          throws java.io.IOException {
        return PARSER.parseFrom(input);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey 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(org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey 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 textsecure.SenderKeyStateStructure.SenderChainKey}
       */
      public static final class Builder extends
          com.google.protobuf.GeneratedMessage.Builder
         implements org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKeyOrBuilder {
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyStateStructure_SenderChainKey_descriptor;
        }

        protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyStateStructure_SenderChainKey_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey.class, org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey.Builder.class);
        }

        // Construct using org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey.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();
          iteration_ = 0;
          bitField0_ = (bitField0_ & ~0x00000001);
          seed_ = com.google.protobuf.ByteString.EMPTY;
          bitField0_ = (bitField0_ & ~0x00000002);
          return this;
        }

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

        public com.google.protobuf.Descriptors.Descriptor
            getDescriptorForType() {
          return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyStateStructure_SenderChainKey_descriptor;
        }

        public org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey getDefaultInstanceForType() {
          return org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey.getDefaultInstance();
        }

        public org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey build() {
          org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey result = buildPartial();
          if (!result.isInitialized()) {
            throw newUninitializedMessageException(result);
          }
          return result;
        }

        public org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey buildPartial() {
          org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey result = new org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey(this);
          int from_bitField0_ = bitField0_;
          int to_bitField0_ = 0;
          if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
            to_bitField0_ |= 0x00000001;
          }
          result.iteration_ = iteration_;
          if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
            to_bitField0_ |= 0x00000002;
          }
          result.seed_ = seed_;
          result.bitField0_ = to_bitField0_;
          onBuilt();
          return result;
        }

        public Builder mergeFrom(com.google.protobuf.Message other) {
          if (other instanceof org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey) {
            return mergeFrom((org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey)other);
          } else {
            super.mergeFrom(other);
            return this;
          }
        }

        public Builder mergeFrom(org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey other) {
          if (other == org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey.getDefaultInstance()) return this;
          if (other.hasIteration()) {
            setIteration(other.getIteration());
          }
          if (other.hasSeed()) {
            setSeed(other.getSeed());
          }
          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 {
          org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey parsedMessage = null;
          try {
            parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            parsedMessage = (org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey) e.getUnfinishedMessage();
            throw e;
          } finally {
            if (parsedMessage != null) {
              mergeFrom(parsedMessage);
            }
          }
          return this;
        }
        private int bitField0_;

        // optional uint32 iteration = 1;
        private int iteration_ ;
        /**
         * optional uint32 iteration = 1;
         */
        public boolean hasIteration() {
          return ((bitField0_ & 0x00000001) == 0x00000001);
        }
        /**
         * optional uint32 iteration = 1;
         */
        public int getIteration() {
          return iteration_;
        }
        /**
         * optional uint32 iteration = 1;
         */
        public Builder setIteration(int value) {
          bitField0_ |= 0x00000001;
          iteration_ = value;
          onChanged();
          return this;
        }
        /**
         * optional uint32 iteration = 1;
         */
        public Builder clearIteration() {
          bitField0_ = (bitField0_ & ~0x00000001);
          iteration_ = 0;
          onChanged();
          return this;
        }

        // optional bytes seed = 2;
        private com.google.protobuf.ByteString seed_ = com.google.protobuf.ByteString.EMPTY;
        /**
         * optional bytes seed = 2;
         */
        public boolean hasSeed() {
          return ((bitField0_ & 0x00000002) == 0x00000002);
        }
        /**
         * optional bytes seed = 2;
         */
        public com.google.protobuf.ByteString getSeed() {
          return seed_;
        }
        /**
         * optional bytes seed = 2;
         */
        public Builder setSeed(com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
          seed_ = value;
          onChanged();
          return this;
        }
        /**
         * optional bytes seed = 2;
         */
        public Builder clearSeed() {
          bitField0_ = (bitField0_ & ~0x00000002);
          seed_ = getDefaultInstance().getSeed();
          onChanged();
          return this;
        }

        // @@protoc_insertion_point(builder_scope:textsecure.SenderKeyStateStructure.SenderChainKey)
      }

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

      // @@protoc_insertion_point(class_scope:textsecure.SenderKeyStateStructure.SenderChainKey)
    }

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

      // optional uint32 iteration = 1;
      /**
       * optional uint32 iteration = 1;
       */
      boolean hasIteration();
      /**
       * optional uint32 iteration = 1;
       */
      int getIteration();

      // optional bytes seed = 2;
      /**
       * optional bytes seed = 2;
       */
      boolean hasSeed();
      /**
       * optional bytes seed = 2;
       */
      com.google.protobuf.ByteString getSeed();
    }
    /**
     * Protobuf type {@code textsecure.SenderKeyStateStructure.SenderMessageKey}
     */
    public static final class SenderMessageKey extends
        com.google.protobuf.GeneratedMessage
        implements SenderMessageKeyOrBuilder {
      // Use SenderMessageKey.newBuilder() to construct.
      private SenderMessageKey(com.google.protobuf.GeneratedMessage.Builder builder) {
        super(builder);
        this.unknownFields = builder.getUnknownFields();
      }
      private SenderMessageKey(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

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

      public SenderMessageKey getDefaultInstanceForType() {
        return defaultInstance;
      }

      private final com.google.protobuf.UnknownFieldSet unknownFields;
      @java.lang.Override
      public final com.google.protobuf.UnknownFieldSet
          getUnknownFields() {
        return this.unknownFields;
      }
      private SenderMessageKey(
          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;
                iteration_ = input.readUInt32();
                break;
              }
              case 18: {
                bitField0_ |= 0x00000002;
                seed_ = input.readBytes();
                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 org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyStateStructure_SenderMessageKey_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyStateStructure_SenderMessageKey_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey.class, org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey.Builder.class);
      }

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

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

      private int bitField0_;
      // optional uint32 iteration = 1;
      public static final int ITERATION_FIELD_NUMBER = 1;
      private int iteration_;
      /**
       * optional uint32 iteration = 1;
       */
      public boolean hasIteration() {
        return ((bitField0_ & 0x00000001) == 0x00000001);
      }
      /**
       * optional uint32 iteration = 1;
       */
      public int getIteration() {
        return iteration_;
      }

      // optional bytes seed = 2;
      public static final int SEED_FIELD_NUMBER = 2;
      private com.google.protobuf.ByteString seed_;
      /**
       * optional bytes seed = 2;
       */
      public boolean hasSeed() {
        return ((bitField0_ & 0x00000002) == 0x00000002);
      }
      /**
       * optional bytes seed = 2;
       */
      public com.google.protobuf.ByteString getSeed() {
        return seed_;
      }

      private void initFields() {
        iteration_ = 0;
        seed_ = com.google.protobuf.ByteString.EMPTY;
      }
      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.writeUInt32(1, iteration_);
        }
        if (((bitField0_ & 0x00000002) == 0x00000002)) {
          output.writeBytes(2, seed_);
        }
        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
            .computeUInt32Size(1, iteration_);
        }
        if (((bitField0_ & 0x00000002) == 0x00000002)) {
          size += com.google.protobuf.CodedOutputStream
            .computeBytesSize(2, seed_);
        }
        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 org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey parseFrom(
          com.google.protobuf.ByteString data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey parseFrom(
          com.google.protobuf.ByteString data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey parseFrom(byte[] data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey parseFrom(
          byte[] data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey parseFrom(java.io.InputStream input)
          throws java.io.IOException {
        return PARSER.parseFrom(input);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey parseFrom(
          java.io.InputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        return PARSER.parseFrom(input, extensionRegistry);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey parseDelimitedFrom(java.io.InputStream input)
          throws java.io.IOException {
        return PARSER.parseDelimitedFrom(input);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey parseDelimitedFrom(
          java.io.InputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        return PARSER.parseDelimitedFrom(input, extensionRegistry);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey parseFrom(
          com.google.protobuf.CodedInputStream input)
          throws java.io.IOException {
        return PARSER.parseFrom(input);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey 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(org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey 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 textsecure.SenderKeyStateStructure.SenderMessageKey}
       */
      public static final class Builder extends
          com.google.protobuf.GeneratedMessage.Builder
         implements org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKeyOrBuilder {
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyStateStructure_SenderMessageKey_descriptor;
        }

        protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyStateStructure_SenderMessageKey_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey.class, org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey.Builder.class);
        }

        // Construct using org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey.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();
          iteration_ = 0;
          bitField0_ = (bitField0_ & ~0x00000001);
          seed_ = com.google.protobuf.ByteString.EMPTY;
          bitField0_ = (bitField0_ & ~0x00000002);
          return this;
        }

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

        public com.google.protobuf.Descriptors.Descriptor
            getDescriptorForType() {
          return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyStateStructure_SenderMessageKey_descriptor;
        }

        public org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey getDefaultInstanceForType() {
          return org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey.getDefaultInstance();
        }

        public org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey build() {
          org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey result = buildPartial();
          if (!result.isInitialized()) {
            throw newUninitializedMessageException(result);
          }
          return result;
        }

        public org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey buildPartial() {
          org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey result = new org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey(this);
          int from_bitField0_ = bitField0_;
          int to_bitField0_ = 0;
          if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
            to_bitField0_ |= 0x00000001;
          }
          result.iteration_ = iteration_;
          if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
            to_bitField0_ |= 0x00000002;
          }
          result.seed_ = seed_;
          result.bitField0_ = to_bitField0_;
          onBuilt();
          return result;
        }

        public Builder mergeFrom(com.google.protobuf.Message other) {
          if (other instanceof org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey) {
            return mergeFrom((org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey)other);
          } else {
            super.mergeFrom(other);
            return this;
          }
        }

        public Builder mergeFrom(org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey other) {
          if (other == org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey.getDefaultInstance()) return this;
          if (other.hasIteration()) {
            setIteration(other.getIteration());
          }
          if (other.hasSeed()) {
            setSeed(other.getSeed());
          }
          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 {
          org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey parsedMessage = null;
          try {
            parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            parsedMessage = (org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey) e.getUnfinishedMessage();
            throw e;
          } finally {
            if (parsedMessage != null) {
              mergeFrom(parsedMessage);
            }
          }
          return this;
        }
        private int bitField0_;

        // optional uint32 iteration = 1;
        private int iteration_ ;
        /**
         * optional uint32 iteration = 1;
         */
        public boolean hasIteration() {
          return ((bitField0_ & 0x00000001) == 0x00000001);
        }
        /**
         * optional uint32 iteration = 1;
         */
        public int getIteration() {
          return iteration_;
        }
        /**
         * optional uint32 iteration = 1;
         */
        public Builder setIteration(int value) {
          bitField0_ |= 0x00000001;
          iteration_ = value;
          onChanged();
          return this;
        }
        /**
         * optional uint32 iteration = 1;
         */
        public Builder clearIteration() {
          bitField0_ = (bitField0_ & ~0x00000001);
          iteration_ = 0;
          onChanged();
          return this;
        }

        // optional bytes seed = 2;
        private com.google.protobuf.ByteString seed_ = com.google.protobuf.ByteString.EMPTY;
        /**
         * optional bytes seed = 2;
         */
        public boolean hasSeed() {
          return ((bitField0_ & 0x00000002) == 0x00000002);
        }
        /**
         * optional bytes seed = 2;
         */
        public com.google.protobuf.ByteString getSeed() {
          return seed_;
        }
        /**
         * optional bytes seed = 2;
         */
        public Builder setSeed(com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
          seed_ = value;
          onChanged();
          return this;
        }
        /**
         * optional bytes seed = 2;
         */
        public Builder clearSeed() {
          bitField0_ = (bitField0_ & ~0x00000002);
          seed_ = getDefaultInstance().getSeed();
          onChanged();
          return this;
        }

        // @@protoc_insertion_point(builder_scope:textsecure.SenderKeyStateStructure.SenderMessageKey)
      }

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

      // @@protoc_insertion_point(class_scope:textsecure.SenderKeyStateStructure.SenderMessageKey)
    }

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

      // optional bytes public = 1;
      /**
       * optional bytes public = 1;
       */
      boolean hasPublic();
      /**
       * optional bytes public = 1;
       */
      com.google.protobuf.ByteString getPublic();

      // optional bytes private = 2;
      /**
       * optional bytes private = 2;
       */
      boolean hasPrivate();
      /**
       * optional bytes private = 2;
       */
      com.google.protobuf.ByteString getPrivate();
    }
    /**
     * Protobuf type {@code textsecure.SenderKeyStateStructure.SenderSigningKey}
     */
    public static final class SenderSigningKey extends
        com.google.protobuf.GeneratedMessage
        implements SenderSigningKeyOrBuilder {
      // Use SenderSigningKey.newBuilder() to construct.
      private SenderSigningKey(com.google.protobuf.GeneratedMessage.Builder builder) {
        super(builder);
        this.unknownFields = builder.getUnknownFields();
      }
      private SenderSigningKey(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

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

      public SenderSigningKey getDefaultInstanceForType() {
        return defaultInstance;
      }

      private final com.google.protobuf.UnknownFieldSet unknownFields;
      @java.lang.Override
      public final com.google.protobuf.UnknownFieldSet
          getUnknownFields() {
        return this.unknownFields;
      }
      private SenderSigningKey(
          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;
                public_ = input.readBytes();
                break;
              }
              case 18: {
                bitField0_ |= 0x00000002;
                private_ = input.readBytes();
                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 org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyStateStructure_SenderSigningKey_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyStateStructure_SenderSigningKey_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey.class, org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey.Builder.class);
      }

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

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

      private int bitField0_;
      // optional bytes public = 1;
      public static final int PUBLIC_FIELD_NUMBER = 1;
      private com.google.protobuf.ByteString public_;
      /**
       * optional bytes public = 1;
       */
      public boolean hasPublic() {
        return ((bitField0_ & 0x00000001) == 0x00000001);
      }
      /**
       * optional bytes public = 1;
       */
      public com.google.protobuf.ByteString getPublic() {
        return public_;
      }

      // optional bytes private = 2;
      public static final int PRIVATE_FIELD_NUMBER = 2;
      private com.google.protobuf.ByteString private_;
      /**
       * optional bytes private = 2;
       */
      public boolean hasPrivate() {
        return ((bitField0_ & 0x00000002) == 0x00000002);
      }
      /**
       * optional bytes private = 2;
       */
      public com.google.protobuf.ByteString getPrivate() {
        return private_;
      }

      private void initFields() {
        public_ = com.google.protobuf.ByteString.EMPTY;
        private_ = com.google.protobuf.ByteString.EMPTY;
      }
      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, public_);
        }
        if (((bitField0_ & 0x00000002) == 0x00000002)) {
          output.writeBytes(2, private_);
        }
        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, public_);
        }
        if (((bitField0_ & 0x00000002) == 0x00000002)) {
          size += com.google.protobuf.CodedOutputStream
            .computeBytesSize(2, private_);
        }
        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 org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey parseFrom(
          com.google.protobuf.ByteString data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey parseFrom(
          com.google.protobuf.ByteString data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey parseFrom(byte[] data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey parseFrom(
          byte[] data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey parseFrom(java.io.InputStream input)
          throws java.io.IOException {
        return PARSER.parseFrom(input);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey parseFrom(
          java.io.InputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        return PARSER.parseFrom(input, extensionRegistry);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey parseDelimitedFrom(java.io.InputStream input)
          throws java.io.IOException {
        return PARSER.parseDelimitedFrom(input);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey parseDelimitedFrom(
          java.io.InputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        return PARSER.parseDelimitedFrom(input, extensionRegistry);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey parseFrom(
          com.google.protobuf.CodedInputStream input)
          throws java.io.IOException {
        return PARSER.parseFrom(input);
      }
      public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey 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(org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey 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 textsecure.SenderKeyStateStructure.SenderSigningKey}
       */
      public static final class Builder extends
          com.google.protobuf.GeneratedMessage.Builder
         implements org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKeyOrBuilder {
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyStateStructure_SenderSigningKey_descriptor;
        }

        protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyStateStructure_SenderSigningKey_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey.class, org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey.Builder.class);
        }

        // Construct using org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey.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();
          public_ = com.google.protobuf.ByteString.EMPTY;
          bitField0_ = (bitField0_ & ~0x00000001);
          private_ = com.google.protobuf.ByteString.EMPTY;
          bitField0_ = (bitField0_ & ~0x00000002);
          return this;
        }

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

        public com.google.protobuf.Descriptors.Descriptor
            getDescriptorForType() {
          return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyStateStructure_SenderSigningKey_descriptor;
        }

        public org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey getDefaultInstanceForType() {
          return org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey.getDefaultInstance();
        }

        public org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey build() {
          org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey result = buildPartial();
          if (!result.isInitialized()) {
            throw newUninitializedMessageException(result);
          }
          return result;
        }

        public org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey buildPartial() {
          org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey result = new org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey(this);
          int from_bitField0_ = bitField0_;
          int to_bitField0_ = 0;
          if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
            to_bitField0_ |= 0x00000001;
          }
          result.public_ = public_;
          if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
            to_bitField0_ |= 0x00000002;
          }
          result.private_ = private_;
          result.bitField0_ = to_bitField0_;
          onBuilt();
          return result;
        }

        public Builder mergeFrom(com.google.protobuf.Message other) {
          if (other instanceof org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey) {
            return mergeFrom((org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey)other);
          } else {
            super.mergeFrom(other);
            return this;
          }
        }

        public Builder mergeFrom(org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey other) {
          if (other == org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey.getDefaultInstance()) return this;
          if (other.hasPublic()) {
            setPublic(other.getPublic());
          }
          if (other.hasPrivate()) {
            setPrivate(other.getPrivate());
          }
          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 {
          org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey parsedMessage = null;
          try {
            parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            parsedMessage = (org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey) e.getUnfinishedMessage();
            throw e;
          } finally {
            if (parsedMessage != null) {
              mergeFrom(parsedMessage);
            }
          }
          return this;
        }
        private int bitField0_;

        // optional bytes public = 1;
        private com.google.protobuf.ByteString public_ = com.google.protobuf.ByteString.EMPTY;
        /**
         * optional bytes public = 1;
         */
        public boolean hasPublic() {
          return ((bitField0_ & 0x00000001) == 0x00000001);
        }
        /**
         * optional bytes public = 1;
         */
        public com.google.protobuf.ByteString getPublic() {
          return public_;
        }
        /**
         * optional bytes public = 1;
         */
        public Builder setPublic(com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
          public_ = value;
          onChanged();
          return this;
        }
        /**
         * optional bytes public = 1;
         */
        public Builder clearPublic() {
          bitField0_ = (bitField0_ & ~0x00000001);
          public_ = getDefaultInstance().getPublic();
          onChanged();
          return this;
        }

        // optional bytes private = 2;
        private com.google.protobuf.ByteString private_ = com.google.protobuf.ByteString.EMPTY;
        /**
         * optional bytes private = 2;
         */
        public boolean hasPrivate() {
          return ((bitField0_ & 0x00000002) == 0x00000002);
        }
        /**
         * optional bytes private = 2;
         */
        public com.google.protobuf.ByteString getPrivate() {
          return private_;
        }
        /**
         * optional bytes private = 2;
         */
        public Builder setPrivate(com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
          private_ = value;
          onChanged();
          return this;
        }
        /**
         * optional bytes private = 2;
         */
        public Builder clearPrivate() {
          bitField0_ = (bitField0_ & ~0x00000002);
          private_ = getDefaultInstance().getPrivate();
          onChanged();
          return this;
        }

        // @@protoc_insertion_point(builder_scope:textsecure.SenderKeyStateStructure.SenderSigningKey)
      }

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

      // @@protoc_insertion_point(class_scope:textsecure.SenderKeyStateStructure.SenderSigningKey)
    }

    private int bitField0_;
    // optional uint32 senderKeyId = 1;
    public static final int SENDERKEYID_FIELD_NUMBER = 1;
    private int senderKeyId_;
    /**
     * optional uint32 senderKeyId = 1;
     */
    public boolean hasSenderKeyId() {
      return ((bitField0_ & 0x00000001) == 0x00000001);
    }
    /**
     * optional uint32 senderKeyId = 1;
     */
    public int getSenderKeyId() {
      return senderKeyId_;
    }

    // optional .textsecure.SenderKeyStateStructure.SenderChainKey senderChainKey = 2;
    public static final int SENDERCHAINKEY_FIELD_NUMBER = 2;
    private org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey senderChainKey_;
    /**
     * optional .textsecure.SenderKeyStateStructure.SenderChainKey senderChainKey = 2;
     */
    public boolean hasSenderChainKey() {
      return ((bitField0_ & 0x00000002) == 0x00000002);
    }
    /**
     * optional .textsecure.SenderKeyStateStructure.SenderChainKey senderChainKey = 2;
     */
    public org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey getSenderChainKey() {
      return senderChainKey_;
    }
    /**
     * optional .textsecure.SenderKeyStateStructure.SenderChainKey senderChainKey = 2;
     */
    public org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKeyOrBuilder getSenderChainKeyOrBuilder() {
      return senderChainKey_;
    }

    // optional .textsecure.SenderKeyStateStructure.SenderSigningKey senderSigningKey = 3;
    public static final int SENDERSIGNINGKEY_FIELD_NUMBER = 3;
    private org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey senderSigningKey_;
    /**
     * optional .textsecure.SenderKeyStateStructure.SenderSigningKey senderSigningKey = 3;
     */
    public boolean hasSenderSigningKey() {
      return ((bitField0_ & 0x00000004) == 0x00000004);
    }
    /**
     * optional .textsecure.SenderKeyStateStructure.SenderSigningKey senderSigningKey = 3;
     */
    public org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey getSenderSigningKey() {
      return senderSigningKey_;
    }
    /**
     * optional .textsecure.SenderKeyStateStructure.SenderSigningKey senderSigningKey = 3;
     */
    public org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKeyOrBuilder getSenderSigningKeyOrBuilder() {
      return senderSigningKey_;
    }

    // repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4;
    public static final int SENDERMESSAGEKEYS_FIELD_NUMBER = 4;
    private java.util.List senderMessageKeys_;
    /**
     * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4;
     */
    public java.util.List getSenderMessageKeysList() {
      return senderMessageKeys_;
    }
    /**
     * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4;
     */
    public java.util.List 
        getSenderMessageKeysOrBuilderList() {
      return senderMessageKeys_;
    }
    /**
     * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4;
     */
    public int getSenderMessageKeysCount() {
      return senderMessageKeys_.size();
    }
    /**
     * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4;
     */
    public org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey getSenderMessageKeys(int index) {
      return senderMessageKeys_.get(index);
    }
    /**
     * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4;
     */
    public org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKeyOrBuilder getSenderMessageKeysOrBuilder(
        int index) {
      return senderMessageKeys_.get(index);
    }

    private void initFields() {
      senderKeyId_ = 0;
      senderChainKey_ = org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey.getDefaultInstance();
      senderSigningKey_ = org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey.getDefaultInstance();
      senderMessageKeys_ = java.util.Collections.emptyList();
    }
    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.writeUInt32(1, senderKeyId_);
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        output.writeMessage(2, senderChainKey_);
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        output.writeMessage(3, senderSigningKey_);
      }
      for (int i = 0; i < senderMessageKeys_.size(); i++) {
        output.writeMessage(4, senderMessageKeys_.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
          .computeUInt32Size(1, senderKeyId_);
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(2, senderChainKey_);
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(3, senderSigningKey_);
      }
      for (int i = 0; i < senderMessageKeys_.size(); i++) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(4, senderMessageKeys_.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 org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input, extensionRegistry);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure 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(org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure 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 textsecure.SenderKeyStateStructure}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessage.Builder
       implements org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructureOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyStateStructure_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyStateStructure_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.class, org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.Builder.class);
      }

      // Construct using org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

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

      public Builder clear() {
        super.clear();
        senderKeyId_ = 0;
        bitField0_ = (bitField0_ & ~0x00000001);
        if (senderChainKeyBuilder_ == null) {
          senderChainKey_ = org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey.getDefaultInstance();
        } else {
          senderChainKeyBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000002);
        if (senderSigningKeyBuilder_ == null) {
          senderSigningKey_ = org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey.getDefaultInstance();
        } else {
          senderSigningKeyBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000004);
        if (senderMessageKeysBuilder_ == null) {
          senderMessageKeys_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000008);
        } else {
          senderMessageKeysBuilder_.clear();
        }
        return this;
      }

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

      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyStateStructure_descriptor;
      }

      public org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure getDefaultInstanceForType() {
        return org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.getDefaultInstance();
      }

      public org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure build() {
        org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      public org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure buildPartial() {
        org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure result = new org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
          to_bitField0_ |= 0x00000001;
        }
        result.senderKeyId_ = senderKeyId_;
        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
          to_bitField0_ |= 0x00000002;
        }
        if (senderChainKeyBuilder_ == null) {
          result.senderChainKey_ = senderChainKey_;
        } else {
          result.senderChainKey_ = senderChainKeyBuilder_.build();
        }
        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
          to_bitField0_ |= 0x00000004;
        }
        if (senderSigningKeyBuilder_ == null) {
          result.senderSigningKey_ = senderSigningKey_;
        } else {
          result.senderSigningKey_ = senderSigningKeyBuilder_.build();
        }
        if (senderMessageKeysBuilder_ == null) {
          if (((bitField0_ & 0x00000008) == 0x00000008)) {
            senderMessageKeys_ = java.util.Collections.unmodifiableList(senderMessageKeys_);
            bitField0_ = (bitField0_ & ~0x00000008);
          }
          result.senderMessageKeys_ = senderMessageKeys_;
        } else {
          result.senderMessageKeys_ = senderMessageKeysBuilder_.build();
        }
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure) {
          return mergeFrom((org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure other) {
        if (other == org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.getDefaultInstance()) return this;
        if (other.hasSenderKeyId()) {
          setSenderKeyId(other.getSenderKeyId());
        }
        if (other.hasSenderChainKey()) {
          mergeSenderChainKey(other.getSenderChainKey());
        }
        if (other.hasSenderSigningKey()) {
          mergeSenderSigningKey(other.getSenderSigningKey());
        }
        if (senderMessageKeysBuilder_ == null) {
          if (!other.senderMessageKeys_.isEmpty()) {
            if (senderMessageKeys_.isEmpty()) {
              senderMessageKeys_ = other.senderMessageKeys_;
              bitField0_ = (bitField0_ & ~0x00000008);
            } else {
              ensureSenderMessageKeysIsMutable();
              senderMessageKeys_.addAll(other.senderMessageKeys_);
            }
            onChanged();
          }
        } else {
          if (!other.senderMessageKeys_.isEmpty()) {
            if (senderMessageKeysBuilder_.isEmpty()) {
              senderMessageKeysBuilder_.dispose();
              senderMessageKeysBuilder_ = null;
              senderMessageKeys_ = other.senderMessageKeys_;
              bitField0_ = (bitField0_ & ~0x00000008);
              senderMessageKeysBuilder_ = 
                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
                   getSenderMessageKeysFieldBuilder() : null;
            } else {
              senderMessageKeysBuilder_.addAllMessages(other.senderMessageKeys_);
            }
          }
        }
        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 {
        org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure) e.getUnfinishedMessage();
          throw e;
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      // optional uint32 senderKeyId = 1;
      private int senderKeyId_ ;
      /**
       * optional uint32 senderKeyId = 1;
       */
      public boolean hasSenderKeyId() {
        return ((bitField0_ & 0x00000001) == 0x00000001);
      }
      /**
       * optional uint32 senderKeyId = 1;
       */
      public int getSenderKeyId() {
        return senderKeyId_;
      }
      /**
       * optional uint32 senderKeyId = 1;
       */
      public Builder setSenderKeyId(int value) {
        bitField0_ |= 0x00000001;
        senderKeyId_ = value;
        onChanged();
        return this;
      }
      /**
       * optional uint32 senderKeyId = 1;
       */
      public Builder clearSenderKeyId() {
        bitField0_ = (bitField0_ & ~0x00000001);
        senderKeyId_ = 0;
        onChanged();
        return this;
      }

      // optional .textsecure.SenderKeyStateStructure.SenderChainKey senderChainKey = 2;
      private org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey senderChainKey_ = org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey.getDefaultInstance();
      private com.google.protobuf.SingleFieldBuilder<
          org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey, org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey.Builder, org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKeyOrBuilder> senderChainKeyBuilder_;
      /**
       * optional .textsecure.SenderKeyStateStructure.SenderChainKey senderChainKey = 2;
       */
      public boolean hasSenderChainKey() {
        return ((bitField0_ & 0x00000002) == 0x00000002);
      }
      /**
       * optional .textsecure.SenderKeyStateStructure.SenderChainKey senderChainKey = 2;
       */
      public org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey getSenderChainKey() {
        if (senderChainKeyBuilder_ == null) {
          return senderChainKey_;
        } else {
          return senderChainKeyBuilder_.getMessage();
        }
      }
      /**
       * optional .textsecure.SenderKeyStateStructure.SenderChainKey senderChainKey = 2;
       */
      public Builder setSenderChainKey(org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey value) {
        if (senderChainKeyBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          senderChainKey_ = value;
          onChanged();
        } else {
          senderChainKeyBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000002;
        return this;
      }
      /**
       * optional .textsecure.SenderKeyStateStructure.SenderChainKey senderChainKey = 2;
       */
      public Builder setSenderChainKey(
          org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey.Builder builderForValue) {
        if (senderChainKeyBuilder_ == null) {
          senderChainKey_ = builderForValue.build();
          onChanged();
        } else {
          senderChainKeyBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000002;
        return this;
      }
      /**
       * optional .textsecure.SenderKeyStateStructure.SenderChainKey senderChainKey = 2;
       */
      public Builder mergeSenderChainKey(org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey value) {
        if (senderChainKeyBuilder_ == null) {
          if (((bitField0_ & 0x00000002) == 0x00000002) &&
              senderChainKey_ != org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey.getDefaultInstance()) {
            senderChainKey_ =
              org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey.newBuilder(senderChainKey_).mergeFrom(value).buildPartial();
          } else {
            senderChainKey_ = value;
          }
          onChanged();
        } else {
          senderChainKeyBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000002;
        return this;
      }
      /**
       * optional .textsecure.SenderKeyStateStructure.SenderChainKey senderChainKey = 2;
       */
      public Builder clearSenderChainKey() {
        if (senderChainKeyBuilder_ == null) {
          senderChainKey_ = org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey.getDefaultInstance();
          onChanged();
        } else {
          senderChainKeyBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000002);
        return this;
      }
      /**
       * optional .textsecure.SenderKeyStateStructure.SenderChainKey senderChainKey = 2;
       */
      public org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey.Builder getSenderChainKeyBuilder() {
        bitField0_ |= 0x00000002;
        onChanged();
        return getSenderChainKeyFieldBuilder().getBuilder();
      }
      /**
       * optional .textsecure.SenderKeyStateStructure.SenderChainKey senderChainKey = 2;
       */
      public org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKeyOrBuilder getSenderChainKeyOrBuilder() {
        if (senderChainKeyBuilder_ != null) {
          return senderChainKeyBuilder_.getMessageOrBuilder();
        } else {
          return senderChainKey_;
        }
      }
      /**
       * optional .textsecure.SenderKeyStateStructure.SenderChainKey senderChainKey = 2;
       */
      private com.google.protobuf.SingleFieldBuilder<
          org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey, org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey.Builder, org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKeyOrBuilder> 
          getSenderChainKeyFieldBuilder() {
        if (senderChainKeyBuilder_ == null) {
          senderChainKeyBuilder_ = new com.google.protobuf.SingleFieldBuilder<
              org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey, org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey.Builder, org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKeyOrBuilder>(
                  senderChainKey_,
                  getParentForChildren(),
                  isClean());
          senderChainKey_ = null;
        }
        return senderChainKeyBuilder_;
      }

      // optional .textsecure.SenderKeyStateStructure.SenderSigningKey senderSigningKey = 3;
      private org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey senderSigningKey_ = org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey.getDefaultInstance();
      private com.google.protobuf.SingleFieldBuilder<
          org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey, org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey.Builder, org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKeyOrBuilder> senderSigningKeyBuilder_;
      /**
       * optional .textsecure.SenderKeyStateStructure.SenderSigningKey senderSigningKey = 3;
       */
      public boolean hasSenderSigningKey() {
        return ((bitField0_ & 0x00000004) == 0x00000004);
      }
      /**
       * optional .textsecure.SenderKeyStateStructure.SenderSigningKey senderSigningKey = 3;
       */
      public org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey getSenderSigningKey() {
        if (senderSigningKeyBuilder_ == null) {
          return senderSigningKey_;
        } else {
          return senderSigningKeyBuilder_.getMessage();
        }
      }
      /**
       * optional .textsecure.SenderKeyStateStructure.SenderSigningKey senderSigningKey = 3;
       */
      public Builder setSenderSigningKey(org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey value) {
        if (senderSigningKeyBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          senderSigningKey_ = value;
          onChanged();
        } else {
          senderSigningKeyBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000004;
        return this;
      }
      /**
       * optional .textsecure.SenderKeyStateStructure.SenderSigningKey senderSigningKey = 3;
       */
      public Builder setSenderSigningKey(
          org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey.Builder builderForValue) {
        if (senderSigningKeyBuilder_ == null) {
          senderSigningKey_ = builderForValue.build();
          onChanged();
        } else {
          senderSigningKeyBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000004;
        return this;
      }
      /**
       * optional .textsecure.SenderKeyStateStructure.SenderSigningKey senderSigningKey = 3;
       */
      public Builder mergeSenderSigningKey(org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey value) {
        if (senderSigningKeyBuilder_ == null) {
          if (((bitField0_ & 0x00000004) == 0x00000004) &&
              senderSigningKey_ != org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey.getDefaultInstance()) {
            senderSigningKey_ =
              org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey.newBuilder(senderSigningKey_).mergeFrom(value).buildPartial();
          } else {
            senderSigningKey_ = value;
          }
          onChanged();
        } else {
          senderSigningKeyBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000004;
        return this;
      }
      /**
       * optional .textsecure.SenderKeyStateStructure.SenderSigningKey senderSigningKey = 3;
       */
      public Builder clearSenderSigningKey() {
        if (senderSigningKeyBuilder_ == null) {
          senderSigningKey_ = org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey.getDefaultInstance();
          onChanged();
        } else {
          senderSigningKeyBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000004);
        return this;
      }
      /**
       * optional .textsecure.SenderKeyStateStructure.SenderSigningKey senderSigningKey = 3;
       */
      public org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey.Builder getSenderSigningKeyBuilder() {
        bitField0_ |= 0x00000004;
        onChanged();
        return getSenderSigningKeyFieldBuilder().getBuilder();
      }
      /**
       * optional .textsecure.SenderKeyStateStructure.SenderSigningKey senderSigningKey = 3;
       */
      public org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKeyOrBuilder getSenderSigningKeyOrBuilder() {
        if (senderSigningKeyBuilder_ != null) {
          return senderSigningKeyBuilder_.getMessageOrBuilder();
        } else {
          return senderSigningKey_;
        }
      }
      /**
       * optional .textsecure.SenderKeyStateStructure.SenderSigningKey senderSigningKey = 3;
       */
      private com.google.protobuf.SingleFieldBuilder<
          org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey, org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey.Builder, org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKeyOrBuilder> 
          getSenderSigningKeyFieldBuilder() {
        if (senderSigningKeyBuilder_ == null) {
          senderSigningKeyBuilder_ = new com.google.protobuf.SingleFieldBuilder<
              org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey, org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey.Builder, org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKeyOrBuilder>(
                  senderSigningKey_,
                  getParentForChildren(),
                  isClean());
          senderSigningKey_ = null;
        }
        return senderSigningKeyBuilder_;
      }

      // repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4;
      private java.util.List senderMessageKeys_ =
        java.util.Collections.emptyList();
      private void ensureSenderMessageKeysIsMutable() {
        if (!((bitField0_ & 0x00000008) == 0x00000008)) {
          senderMessageKeys_ = new java.util.ArrayList(senderMessageKeys_);
          bitField0_ |= 0x00000008;
         }
      }

      private com.google.protobuf.RepeatedFieldBuilder<
          org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey, org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey.Builder, org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKeyOrBuilder> senderMessageKeysBuilder_;

      /**
       * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4;
       */
      public java.util.List getSenderMessageKeysList() {
        if (senderMessageKeysBuilder_ == null) {
          return java.util.Collections.unmodifiableList(senderMessageKeys_);
        } else {
          return senderMessageKeysBuilder_.getMessageList();
        }
      }
      /**
       * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4;
       */
      public int getSenderMessageKeysCount() {
        if (senderMessageKeysBuilder_ == null) {
          return senderMessageKeys_.size();
        } else {
          return senderMessageKeysBuilder_.getCount();
        }
      }
      /**
       * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4;
       */
      public org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey getSenderMessageKeys(int index) {
        if (senderMessageKeysBuilder_ == null) {
          return senderMessageKeys_.get(index);
        } else {
          return senderMessageKeysBuilder_.getMessage(index);
        }
      }
      /**
       * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4;
       */
      public Builder setSenderMessageKeys(
          int index, org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey value) {
        if (senderMessageKeysBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureSenderMessageKeysIsMutable();
          senderMessageKeys_.set(index, value);
          onChanged();
        } else {
          senderMessageKeysBuilder_.setMessage(index, value);
        }
        return this;
      }
      /**
       * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4;
       */
      public Builder setSenderMessageKeys(
          int index, org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey.Builder builderForValue) {
        if (senderMessageKeysBuilder_ == null) {
          ensureSenderMessageKeysIsMutable();
          senderMessageKeys_.set(index, builderForValue.build());
          onChanged();
        } else {
          senderMessageKeysBuilder_.setMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4;
       */
      public Builder addSenderMessageKeys(org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey value) {
        if (senderMessageKeysBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureSenderMessageKeysIsMutable();
          senderMessageKeys_.add(value);
          onChanged();
        } else {
          senderMessageKeysBuilder_.addMessage(value);
        }
        return this;
      }
      /**
       * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4;
       */
      public Builder addSenderMessageKeys(
          int index, org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey value) {
        if (senderMessageKeysBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureSenderMessageKeysIsMutable();
          senderMessageKeys_.add(index, value);
          onChanged();
        } else {
          senderMessageKeysBuilder_.addMessage(index, value);
        }
        return this;
      }
      /**
       * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4;
       */
      public Builder addSenderMessageKeys(
          org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey.Builder builderForValue) {
        if (senderMessageKeysBuilder_ == null) {
          ensureSenderMessageKeysIsMutable();
          senderMessageKeys_.add(builderForValue.build());
          onChanged();
        } else {
          senderMessageKeysBuilder_.addMessage(builderForValue.build());
        }
        return this;
      }
      /**
       * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4;
       */
      public Builder addSenderMessageKeys(
          int index, org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey.Builder builderForValue) {
        if (senderMessageKeysBuilder_ == null) {
          ensureSenderMessageKeysIsMutable();
          senderMessageKeys_.add(index, builderForValue.build());
          onChanged();
        } else {
          senderMessageKeysBuilder_.addMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4;
       */
      public Builder addAllSenderMessageKeys(
          java.lang.Iterable values) {
        if (senderMessageKeysBuilder_ == null) {
          ensureSenderMessageKeysIsMutable();
          super.addAll(values, senderMessageKeys_);
          onChanged();
        } else {
          senderMessageKeysBuilder_.addAllMessages(values);
        }
        return this;
      }
      /**
       * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4;
       */
      public Builder clearSenderMessageKeys() {
        if (senderMessageKeysBuilder_ == null) {
          senderMessageKeys_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000008);
          onChanged();
        } else {
          senderMessageKeysBuilder_.clear();
        }
        return this;
      }
      /**
       * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4;
       */
      public Builder removeSenderMessageKeys(int index) {
        if (senderMessageKeysBuilder_ == null) {
          ensureSenderMessageKeysIsMutable();
          senderMessageKeys_.remove(index);
          onChanged();
        } else {
          senderMessageKeysBuilder_.remove(index);
        }
        return this;
      }
      /**
       * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4;
       */
      public org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey.Builder getSenderMessageKeysBuilder(
          int index) {
        return getSenderMessageKeysFieldBuilder().getBuilder(index);
      }
      /**
       * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4;
       */
      public org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKeyOrBuilder getSenderMessageKeysOrBuilder(
          int index) {
        if (senderMessageKeysBuilder_ == null) {
          return senderMessageKeys_.get(index);  } else {
          return senderMessageKeysBuilder_.getMessageOrBuilder(index);
        }
      }
      /**
       * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4;
       */
      public java.util.List 
           getSenderMessageKeysOrBuilderList() {
        if (senderMessageKeysBuilder_ != null) {
          return senderMessageKeysBuilder_.getMessageOrBuilderList();
        } else {
          return java.util.Collections.unmodifiableList(senderMessageKeys_);
        }
      }
      /**
       * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4;
       */
      public org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey.Builder addSenderMessageKeysBuilder() {
        return getSenderMessageKeysFieldBuilder().addBuilder(
            org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey.getDefaultInstance());
      }
      /**
       * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4;
       */
      public org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey.Builder addSenderMessageKeysBuilder(
          int index) {
        return getSenderMessageKeysFieldBuilder().addBuilder(
            index, org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey.getDefaultInstance());
      }
      /**
       * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4;
       */
      public java.util.List 
           getSenderMessageKeysBuilderList() {
        return getSenderMessageKeysFieldBuilder().getBuilderList();
      }
      private com.google.protobuf.RepeatedFieldBuilder<
          org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey, org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey.Builder, org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKeyOrBuilder> 
          getSenderMessageKeysFieldBuilder() {
        if (senderMessageKeysBuilder_ == null) {
          senderMessageKeysBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
              org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey, org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey.Builder, org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKeyOrBuilder>(
                  senderMessageKeys_,
                  ((bitField0_ & 0x00000008) == 0x00000008),
                  getParentForChildren(),
                  isClean());
          senderMessageKeys_ = null;
        }
        return senderMessageKeysBuilder_;
      }

      // @@protoc_insertion_point(builder_scope:textsecure.SenderKeyStateStructure)
    }

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

    // @@protoc_insertion_point(class_scope:textsecure.SenderKeyStateStructure)
  }

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

    // repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1;
    /**
     * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1;
     */
    java.util.List 
        getSenderKeyStatesList();
    /**
     * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1;
     */
    org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure getSenderKeyStates(int index);
    /**
     * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1;
     */
    int getSenderKeyStatesCount();
    /**
     * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1;
     */
    java.util.List 
        getSenderKeyStatesOrBuilderList();
    /**
     * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1;
     */
    org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructureOrBuilder getSenderKeyStatesOrBuilder(
        int index);
  }
  /**
   * Protobuf type {@code textsecure.SenderKeyRecordStructure}
   */
  public static final class SenderKeyRecordStructure extends
      com.google.protobuf.GeneratedMessage
      implements SenderKeyRecordStructureOrBuilder {
    // Use SenderKeyRecordStructure.newBuilder() to construct.
    private SenderKeyRecordStructure(com.google.protobuf.GeneratedMessage.Builder builder) {
      super(builder);
      this.unknownFields = builder.getUnknownFields();
    }
    private SenderKeyRecordStructure(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

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

    public SenderKeyRecordStructure getDefaultInstanceForType() {
      return defaultInstance;
    }

    private final com.google.protobuf.UnknownFieldSet unknownFields;
    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
      return this.unknownFields;
    }
    private SenderKeyRecordStructure(
        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)) {
                senderKeyStates_ = new java.util.ArrayList();
                mutable_bitField0_ |= 0x00000001;
              }
              senderKeyStates_.add(input.readMessage(org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.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_ & 0x00000001) == 0x00000001)) {
          senderKeyStates_ = java.util.Collections.unmodifiableList(senderKeyStates_);
        }
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyRecordStructure_descriptor;
    }

    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyRecordStructure_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              org.whispersystems.libsignal.state.StorageProtos.SenderKeyRecordStructure.class, org.whispersystems.libsignal.state.StorageProtos.SenderKeyRecordStructure.Builder.class);
    }

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

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

    // repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1;
    public static final int SENDERKEYSTATES_FIELD_NUMBER = 1;
    private java.util.List senderKeyStates_;
    /**
     * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1;
     */
    public java.util.List getSenderKeyStatesList() {
      return senderKeyStates_;
    }
    /**
     * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1;
     */
    public java.util.List 
        getSenderKeyStatesOrBuilderList() {
      return senderKeyStates_;
    }
    /**
     * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1;
     */
    public int getSenderKeyStatesCount() {
      return senderKeyStates_.size();
    }
    /**
     * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1;
     */
    public org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure getSenderKeyStates(int index) {
      return senderKeyStates_.get(index);
    }
    /**
     * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1;
     */
    public org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructureOrBuilder getSenderKeyStatesOrBuilder(
        int index) {
      return senderKeyStates_.get(index);
    }

    private void initFields() {
      senderKeyStates_ = java.util.Collections.emptyList();
    }
    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();
      for (int i = 0; i < senderKeyStates_.size(); i++) {
        output.writeMessage(1, senderKeyStates_.get(i));
      }
      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 < senderKeyStates_.size(); i++) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(1, senderKeyStates_.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 org.whispersystems.libsignal.state.StorageProtos.SenderKeyRecordStructure parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyRecordStructure parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyRecordStructure parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyRecordStructure parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyRecordStructure parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyRecordStructure parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyRecordStructure parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyRecordStructure parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input, extensionRegistry);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyRecordStructure parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static org.whispersystems.libsignal.state.StorageProtos.SenderKeyRecordStructure 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(org.whispersystems.libsignal.state.StorageProtos.SenderKeyRecordStructure 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 textsecure.SenderKeyRecordStructure}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessage.Builder
       implements org.whispersystems.libsignal.state.StorageProtos.SenderKeyRecordStructureOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyRecordStructure_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyRecordStructure_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.whispersystems.libsignal.state.StorageProtos.SenderKeyRecordStructure.class, org.whispersystems.libsignal.state.StorageProtos.SenderKeyRecordStructure.Builder.class);
      }

      // Construct using org.whispersystems.libsignal.state.StorageProtos.SenderKeyRecordStructure.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

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

      public Builder clear() {
        super.clear();
        if (senderKeyStatesBuilder_ == null) {
          senderKeyStates_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000001);
        } else {
          senderKeyStatesBuilder_.clear();
        }
        return this;
      }

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

      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return org.whispersystems.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyRecordStructure_descriptor;
      }

      public org.whispersystems.libsignal.state.StorageProtos.SenderKeyRecordStructure getDefaultInstanceForType() {
        return org.whispersystems.libsignal.state.StorageProtos.SenderKeyRecordStructure.getDefaultInstance();
      }

      public org.whispersystems.libsignal.state.StorageProtos.SenderKeyRecordStructure build() {
        org.whispersystems.libsignal.state.StorageProtos.SenderKeyRecordStructure result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      public org.whispersystems.libsignal.state.StorageProtos.SenderKeyRecordStructure buildPartial() {
        org.whispersystems.libsignal.state.StorageProtos.SenderKeyRecordStructure result = new org.whispersystems.libsignal.state.StorageProtos.SenderKeyRecordStructure(this);
        int from_bitField0_ = bitField0_;
        if (senderKeyStatesBuilder_ == null) {
          if (((bitField0_ & 0x00000001) == 0x00000001)) {
            senderKeyStates_ = java.util.Collections.unmodifiableList(senderKeyStates_);
            bitField0_ = (bitField0_ & ~0x00000001);
          }
          result.senderKeyStates_ = senderKeyStates_;
        } else {
          result.senderKeyStates_ = senderKeyStatesBuilder_.build();
        }
        onBuilt();
        return result;
      }

      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof org.whispersystems.libsignal.state.StorageProtos.SenderKeyRecordStructure) {
          return mergeFrom((org.whispersystems.libsignal.state.StorageProtos.SenderKeyRecordStructure)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(org.whispersystems.libsignal.state.StorageProtos.SenderKeyRecordStructure other) {
        if (other == org.whispersystems.libsignal.state.StorageProtos.SenderKeyRecordStructure.getDefaultInstance()) return this;
        if (senderKeyStatesBuilder_ == null) {
          if (!other.senderKeyStates_.isEmpty()) {
            if (senderKeyStates_.isEmpty()) {
              senderKeyStates_ = other.senderKeyStates_;
              bitField0_ = (bitField0_ & ~0x00000001);
            } else {
              ensureSenderKeyStatesIsMutable();
              senderKeyStates_.addAll(other.senderKeyStates_);
            }
            onChanged();
          }
        } else {
          if (!other.senderKeyStates_.isEmpty()) {
            if (senderKeyStatesBuilder_.isEmpty()) {
              senderKeyStatesBuilder_.dispose();
              senderKeyStatesBuilder_ = null;
              senderKeyStates_ = other.senderKeyStates_;
              bitField0_ = (bitField0_ & ~0x00000001);
              senderKeyStatesBuilder_ = 
                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
                   getSenderKeyStatesFieldBuilder() : null;
            } else {
              senderKeyStatesBuilder_.addAllMessages(other.senderKeyStates_);
            }
          }
        }
        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 {
        org.whispersystems.libsignal.state.StorageProtos.SenderKeyRecordStructure parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (org.whispersystems.libsignal.state.StorageProtos.SenderKeyRecordStructure) e.getUnfinishedMessage();
          throw e;
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      // repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1;
      private java.util.List senderKeyStates_ =
        java.util.Collections.emptyList();
      private void ensureSenderKeyStatesIsMutable() {
        if (!((bitField0_ & 0x00000001) == 0x00000001)) {
          senderKeyStates_ = new java.util.ArrayList(senderKeyStates_);
          bitField0_ |= 0x00000001;
         }
      }

      private com.google.protobuf.RepeatedFieldBuilder<
          org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure, org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.Builder, org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructureOrBuilder> senderKeyStatesBuilder_;

      /**
       * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1;
       */
      public java.util.List getSenderKeyStatesList() {
        if (senderKeyStatesBuilder_ == null) {
          return java.util.Collections.unmodifiableList(senderKeyStates_);
        } else {
          return senderKeyStatesBuilder_.getMessageList();
        }
      }
      /**
       * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1;
       */
      public int getSenderKeyStatesCount() {
        if (senderKeyStatesBuilder_ == null) {
          return senderKeyStates_.size();
        } else {
          return senderKeyStatesBuilder_.getCount();
        }
      }
      /**
       * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1;
       */
      public org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure getSenderKeyStates(int index) {
        if (senderKeyStatesBuilder_ == null) {
          return senderKeyStates_.get(index);
        } else {
          return senderKeyStatesBuilder_.getMessage(index);
        }
      }
      /**
       * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1;
       */
      public Builder setSenderKeyStates(
          int index, org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure value) {
        if (senderKeyStatesBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureSenderKeyStatesIsMutable();
          senderKeyStates_.set(index, value);
          onChanged();
        } else {
          senderKeyStatesBuilder_.setMessage(index, value);
        }
        return this;
      }
      /**
       * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1;
       */
      public Builder setSenderKeyStates(
          int index, org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.Builder builderForValue) {
        if (senderKeyStatesBuilder_ == null) {
          ensureSenderKeyStatesIsMutable();
          senderKeyStates_.set(index, builderForValue.build());
          onChanged();
        } else {
          senderKeyStatesBuilder_.setMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1;
       */
      public Builder addSenderKeyStates(org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure value) {
        if (senderKeyStatesBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureSenderKeyStatesIsMutable();
          senderKeyStates_.add(value);
          onChanged();
        } else {
          senderKeyStatesBuilder_.addMessage(value);
        }
        return this;
      }
      /**
       * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1;
       */
      public Builder addSenderKeyStates(
          int index, org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure value) {
        if (senderKeyStatesBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureSenderKeyStatesIsMutable();
          senderKeyStates_.add(index, value);
          onChanged();
        } else {
          senderKeyStatesBuilder_.addMessage(index, value);
        }
        return this;
      }
      /**
       * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1;
       */
      public Builder addSenderKeyStates(
          org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.Builder builderForValue) {
        if (senderKeyStatesBuilder_ == null) {
          ensureSenderKeyStatesIsMutable();
          senderKeyStates_.add(builderForValue.build());
          onChanged();
        } else {
          senderKeyStatesBuilder_.addMessage(builderForValue.build());
        }
        return this;
      }
      /**
       * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1;
       */
      public Builder addSenderKeyStates(
          int index, org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.Builder builderForValue) {
        if (senderKeyStatesBuilder_ == null) {
          ensureSenderKeyStatesIsMutable();
          senderKeyStates_.add(index, builderForValue.build());
          onChanged();
        } else {
          senderKeyStatesBuilder_.addMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1;
       */
      public Builder addAllSenderKeyStates(
          java.lang.Iterable values) {
        if (senderKeyStatesBuilder_ == null) {
          ensureSenderKeyStatesIsMutable();
          super.addAll(values, senderKeyStates_);
          onChanged();
        } else {
          senderKeyStatesBuilder_.addAllMessages(values);
        }
        return this;
      }
      /**
       * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1;
       */
      public Builder clearSenderKeyStates() {
        if (senderKeyStatesBuilder_ == null) {
          senderKeyStates_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000001);
          onChanged();
        } else {
          senderKeyStatesBuilder_.clear();
        }
        return this;
      }
      /**
       * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1;
       */
      public Builder removeSenderKeyStates(int index) {
        if (senderKeyStatesBuilder_ == null) {
          ensureSenderKeyStatesIsMutable();
          senderKeyStates_.remove(index);
          onChanged();
        } else {
          senderKeyStatesBuilder_.remove(index);
        }
        return this;
      }
      /**
       * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1;
       */
      public org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.Builder getSenderKeyStatesBuilder(
          int index) {
        return getSenderKeyStatesFieldBuilder().getBuilder(index);
      }
      /**
       * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1;
       */
      public org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructureOrBuilder getSenderKeyStatesOrBuilder(
          int index) {
        if (senderKeyStatesBuilder_ == null) {
          return senderKeyStates_.get(index);  } else {
          return senderKeyStatesBuilder_.getMessageOrBuilder(index);
        }
      }
      /**
       * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1;
       */
      public java.util.List 
           getSenderKeyStatesOrBuilderList() {
        if (senderKeyStatesBuilder_ != null) {
          return senderKeyStatesBuilder_.getMessageOrBuilderList();
        } else {
          return java.util.Collections.unmodifiableList(senderKeyStates_);
        }
      }
      /**
       * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1;
       */
      public org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.Builder addSenderKeyStatesBuilder() {
        return getSenderKeyStatesFieldBuilder().addBuilder(
            org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.getDefaultInstance());
      }
      /**
       * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1;
       */
      public org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.Builder addSenderKeyStatesBuilder(
          int index) {
        return getSenderKeyStatesFieldBuilder().addBuilder(
            index, org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.getDefaultInstance());
      }
      /**
       * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1;
       */
      public java.util.List 
           getSenderKeyStatesBuilderList() {
        return getSenderKeyStatesFieldBuilder().getBuilderList();
      }
      private com.google.protobuf.RepeatedFieldBuilder<
          org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure, org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.Builder, org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructureOrBuilder> 
          getSenderKeyStatesFieldBuilder() {
        if (senderKeyStatesBuilder_ == null) {
          senderKeyStatesBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
              org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure, org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructure.Builder, org.whispersystems.libsignal.state.StorageProtos.SenderKeyStateStructureOrBuilder>(
                  senderKeyStates_,
                  ((bitField0_ & 0x00000001) == 0x00000001),
                  getParentForChildren(),
                  isClean());
          senderKeyStates_ = null;
        }
        return senderKeyStatesBuilder_;
      }

      // @@protoc_insertion_point(builder_scope:textsecure.SenderKeyRecordStructure)
    }

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

    // @@protoc_insertion_point(class_scope:textsecure.SenderKeyRecordStructure)
  }

  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_textsecure_SessionStructure_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_textsecure_SessionStructure_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_textsecure_SessionStructure_Chain_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_textsecure_SessionStructure_Chain_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_textsecure_SessionStructure_Chain_ChainKey_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_textsecure_SessionStructure_Chain_ChainKey_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_textsecure_SessionStructure_Chain_MessageKey_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_textsecure_SessionStructure_Chain_MessageKey_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_textsecure_SessionStructure_PendingKeyExchange_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_textsecure_SessionStructure_PendingKeyExchange_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_textsecure_SessionStructure_PendingPreKey_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_textsecure_SessionStructure_PendingPreKey_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_textsecure_RecordStructure_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_textsecure_RecordStructure_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_textsecure_PreKeyRecordStructure_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_textsecure_PreKeyRecordStructure_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_textsecure_SignedPreKeyRecordStructure_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_textsecure_SignedPreKeyRecordStructure_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_textsecure_IdentityKeyPairStructure_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_textsecure_IdentityKeyPairStructure_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_textsecure_SenderKeyStateStructure_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_textsecure_SenderKeyStateStructure_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_textsecure_SenderKeyStateStructure_SenderChainKey_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_textsecure_SenderKeyStateStructure_SenderChainKey_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_textsecure_SenderKeyStateStructure_SenderMessageKey_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_textsecure_SenderKeyStateStructure_SenderMessageKey_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_textsecure_SenderKeyStateStructure_SenderSigningKey_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_textsecure_SenderKeyStateStructure_SenderSigningKey_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_textsecure_SenderKeyRecordStructure_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_textsecure_SenderKeyRecordStructure_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\032LocalStorageProtocol.proto\022\ntextsecure" +
      "\"\323\010\n\020SessionStructure\022\026\n\016sessionVersion\030" +
      "\001 \001(\r\022\033\n\023localIdentityPublic\030\002 \001(\014\022\034\n\024re" +
      "moteIdentityPublic\030\003 \001(\014\022\017\n\007rootKey\030\004 \001(" +
      "\014\022\027\n\017previousCounter\030\005 \001(\r\0227\n\013senderChai" +
      "n\030\006 \001(\0132\".textsecure.SessionStructure.Ch" +
      "ain\022:\n\016receiverChains\030\007 \003(\0132\".textsecure" +
      ".SessionStructure.Chain\022K\n\022pendingKeyExc" +
      "hange\030\010 \001(\0132/.textsecure.SessionStructur" +
      "e.PendingKeyExchange\022A\n\rpendingPreKey\030\t ",
      "\001(\0132*.textsecure.SessionStructure.Pendin" +
      "gPreKey\022\034\n\024remoteRegistrationId\030\n \001(\r\022\033\n" +
      "\023localRegistrationId\030\013 \001(\r\022\024\n\014needsRefre" +
      "sh\030\014 \001(\010\022\024\n\014aliceBaseKey\030\r \001(\014\032\271\002\n\005Chain" +
      "\022\030\n\020senderRatchetKey\030\001 \001(\014\022\037\n\027senderRatc" +
      "hetKeyPrivate\030\002 \001(\014\022=\n\010chainKey\030\003 \001(\0132+." +
      "textsecure.SessionStructure.Chain.ChainK" +
      "ey\022B\n\013messageKeys\030\004 \003(\0132-.textsecure.Ses" +
      "sionStructure.Chain.MessageKey\032&\n\010ChainK" +
      "ey\022\r\n\005index\030\001 \001(\r\022\013\n\003key\030\002 \001(\014\032J\n\nMessag",
      "eKey\022\r\n\005index\030\001 \001(\r\022\021\n\tcipherKey\030\002 \001(\014\022\016" +
      "\n\006macKey\030\003 \001(\014\022\n\n\002iv\030\004 \001(\014\032\315\001\n\022PendingKe" +
      "yExchange\022\020\n\010sequence\030\001 \001(\r\022\024\n\014localBase" +
      "Key\030\002 \001(\014\022\033\n\023localBaseKeyPrivate\030\003 \001(\014\022\027" +
      "\n\017localRatchetKey\030\004 \001(\014\022\036\n\026localRatchetK" +
      "eyPrivate\030\005 \001(\014\022\030\n\020localIdentityKey\030\007 \001(" +
      "\014\022\037\n\027localIdentityKeyPrivate\030\010 \001(\014\032J\n\rPe" +
      "ndingPreKey\022\020\n\010preKeyId\030\001 \001(\r\022\026\n\016signedP" +
      "reKeyId\030\003 \001(\005\022\017\n\007baseKey\030\002 \001(\014\"\177\n\017Record" +
      "Structure\0224\n\016currentSession\030\001 \001(\0132\034.text",
      "secure.SessionStructure\0226\n\020previousSessi" +
      "ons\030\002 \003(\0132\034.textsecure.SessionStructure\"" +
      "J\n\025PreKeyRecordStructure\022\n\n\002id\030\001 \001(\r\022\021\n\t" +
      "publicKey\030\002 \001(\014\022\022\n\nprivateKey\030\003 \001(\014\"v\n\033S" +
      "ignedPreKeyRecordStructure\022\n\n\002id\030\001 \001(\r\022\021" +
      "\n\tpublicKey\030\002 \001(\014\022\022\n\nprivateKey\030\003 \001(\014\022\021\n" +
      "\tsignature\030\004 \001(\014\022\021\n\ttimestamp\030\005 \001(\006\"A\n\030I" +
      "dentityKeyPairStructure\022\021\n\tpublicKey\030\001 \001" +
      "(\014\022\022\n\nprivateKey\030\002 \001(\014\"\270\003\n\027SenderKeyStat" +
      "eStructure\022\023\n\013senderKeyId\030\001 \001(\r\022J\n\016sende",
      "rChainKey\030\002 \001(\01322.textsecure.SenderKeySt" +
      "ateStructure.SenderChainKey\022N\n\020senderSig" +
      "ningKey\030\003 \001(\01324.textsecure.SenderKeyStat" +
      "eStructure.SenderSigningKey\022O\n\021senderMes" +
      "sageKeys\030\004 \003(\01324.textsecure.SenderKeySta" +
      "teStructure.SenderMessageKey\0321\n\016SenderCh" +
      "ainKey\022\021\n\titeration\030\001 \001(\r\022\014\n\004seed\030\002 \001(\014\032" +
      "3\n\020SenderMessageKey\022\021\n\titeration\030\001 \001(\r\022\014" +
      "\n\004seed\030\002 \001(\014\0323\n\020SenderSigningKey\022\016\n\006publ" +
      "ic\030\001 \001(\014\022\017\n\007private\030\002 \001(\014\"X\n\030SenderKeyRe",
      "cordStructure\022<\n\017senderKeyStates\030\001 \003(\0132#" +
      ".textsecure.SenderKeyStateStructureB3\n\"o" +
      "rg.whispersystems.libsignal.stateB\rStora" +
      "geProtos"
    };
    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_textsecure_SessionStructure_descriptor =
            getDescriptor().getMessageTypes().get(0);
          internal_static_textsecure_SessionStructure_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_textsecure_SessionStructure_descriptor,
              new java.lang.String[] { "SessionVersion", "LocalIdentityPublic", "RemoteIdentityPublic", "RootKey", "PreviousCounter", "SenderChain", "ReceiverChains", "PendingKeyExchange", "PendingPreKey", "RemoteRegistrationId", "LocalRegistrationId", "NeedsRefresh", "AliceBaseKey", });
          internal_static_textsecure_SessionStructure_Chain_descriptor =
            internal_static_textsecure_SessionStructure_descriptor.getNestedTypes().get(0);
          internal_static_textsecure_SessionStructure_Chain_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_textsecure_SessionStructure_Chain_descriptor,
              new java.lang.String[] { "SenderRatchetKey", "SenderRatchetKeyPrivate", "ChainKey", "MessageKeys", });
          internal_static_textsecure_SessionStructure_Chain_ChainKey_descriptor =
            internal_static_textsecure_SessionStructure_Chain_descriptor.getNestedTypes().get(0);
          internal_static_textsecure_SessionStructure_Chain_ChainKey_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_textsecure_SessionStructure_Chain_ChainKey_descriptor,
              new java.lang.String[] { "Index", "Key", });
          internal_static_textsecure_SessionStructure_Chain_MessageKey_descriptor =
            internal_static_textsecure_SessionStructure_Chain_descriptor.getNestedTypes().get(1);
          internal_static_textsecure_SessionStructure_Chain_MessageKey_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_textsecure_SessionStructure_Chain_MessageKey_descriptor,
              new java.lang.String[] { "Index", "CipherKey", "MacKey", "Iv", });
          internal_static_textsecure_SessionStructure_PendingKeyExchange_descriptor =
            internal_static_textsecure_SessionStructure_descriptor.getNestedTypes().get(1);
          internal_static_textsecure_SessionStructure_PendingKeyExchange_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_textsecure_SessionStructure_PendingKeyExchange_descriptor,
              new java.lang.String[] { "Sequence", "LocalBaseKey", "LocalBaseKeyPrivate", "LocalRatchetKey", "LocalRatchetKeyPrivate", "LocalIdentityKey", "LocalIdentityKeyPrivate", });
          internal_static_textsecure_SessionStructure_PendingPreKey_descriptor =
            internal_static_textsecure_SessionStructure_descriptor.getNestedTypes().get(2);
          internal_static_textsecure_SessionStructure_PendingPreKey_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_textsecure_SessionStructure_PendingPreKey_descriptor,
              new java.lang.String[] { "PreKeyId", "SignedPreKeyId", "BaseKey", });
          internal_static_textsecure_RecordStructure_descriptor =
            getDescriptor().getMessageTypes().get(1);
          internal_static_textsecure_RecordStructure_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_textsecure_RecordStructure_descriptor,
              new java.lang.String[] { "CurrentSession", "PreviousSessions", });
          internal_static_textsecure_PreKeyRecordStructure_descriptor =
            getDescriptor().getMessageTypes().get(2);
          internal_static_textsecure_PreKeyRecordStructure_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_textsecure_PreKeyRecordStructure_descriptor,
              new java.lang.String[] { "Id", "PublicKey", "PrivateKey", });
          internal_static_textsecure_SignedPreKeyRecordStructure_descriptor =
            getDescriptor().getMessageTypes().get(3);
          internal_static_textsecure_SignedPreKeyRecordStructure_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_textsecure_SignedPreKeyRecordStructure_descriptor,
              new java.lang.String[] { "Id", "PublicKey", "PrivateKey", "Signature", "Timestamp", });
          internal_static_textsecure_IdentityKeyPairStructure_descriptor =
            getDescriptor().getMessageTypes().get(4);
          internal_static_textsecure_IdentityKeyPairStructure_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_textsecure_IdentityKeyPairStructure_descriptor,
              new java.lang.String[] { "PublicKey", "PrivateKey", });
          internal_static_textsecure_SenderKeyStateStructure_descriptor =
            getDescriptor().getMessageTypes().get(5);
          internal_static_textsecure_SenderKeyStateStructure_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_textsecure_SenderKeyStateStructure_descriptor,
              new java.lang.String[] { "SenderKeyId", "SenderChainKey", "SenderSigningKey", "SenderMessageKeys", });
          internal_static_textsecure_SenderKeyStateStructure_SenderChainKey_descriptor =
            internal_static_textsecure_SenderKeyStateStructure_descriptor.getNestedTypes().get(0);
          internal_static_textsecure_SenderKeyStateStructure_SenderChainKey_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_textsecure_SenderKeyStateStructure_SenderChainKey_descriptor,
              new java.lang.String[] { "Iteration", "Seed", });
          internal_static_textsecure_SenderKeyStateStructure_SenderMessageKey_descriptor =
            internal_static_textsecure_SenderKeyStateStructure_descriptor.getNestedTypes().get(1);
          internal_static_textsecure_SenderKeyStateStructure_SenderMessageKey_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_textsecure_SenderKeyStateStructure_SenderMessageKey_descriptor,
              new java.lang.String[] { "Iteration", "Seed", });
          internal_static_textsecure_SenderKeyStateStructure_SenderSigningKey_descriptor =
            internal_static_textsecure_SenderKeyStateStructure_descriptor.getNestedTypes().get(2);
          internal_static_textsecure_SenderKeyStateStructure_SenderSigningKey_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_textsecure_SenderKeyStateStructure_SenderSigningKey_descriptor,
              new java.lang.String[] { "Public", "Private", });
          internal_static_textsecure_SenderKeyRecordStructure_descriptor =
            getDescriptor().getMessageTypes().get(6);
          internal_static_textsecure_SenderKeyRecordStructure_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_textsecure_SenderKeyRecordStructure_descriptor,
              new java.lang.String[] { "SenderKeyStates", });
          return null;
        }
      };
    com.google.protobuf.Descriptors.FileDescriptor
      .internalBuildGeneratedFileFrom(descriptorData,
        new com.google.protobuf.Descriptors.FileDescriptor[] {
        }, assigner);
  }

  // @@protoc_insertion_point(outer_class_scope)
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy