// Generated by the protocol buffer compiler.  DO NOT EDIT!
// source: src/main/protobuf/osmformat.proto

package org.openstreetmap.osmosis.osmbinary;

public final class Osmformat {
  private Osmformat() {}
  public static void registerAllExtensions(
      com.google.protobuf.ExtensionRegistryLite registry) {
  }

  public static void registerAllExtensions(
      com.google.protobuf.ExtensionRegistry registry) {
    registerAllExtensions(
        (com.google.protobuf.ExtensionRegistryLite) registry);
  }
  public interface HeaderBlockOrBuilder extends
      // @@protoc_insertion_point(interface_extends:OSMPBF.HeaderBlock)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>optional .OSMPBF.HeaderBBox bbox = 1;</code>
     * @return Whether the bbox field is set.
     */
    boolean hasBbox();
    /**
     * <code>optional .OSMPBF.HeaderBBox bbox = 1;</code>
     * @return The bbox.
     */
    org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox getBbox();
    /**
     * <code>optional .OSMPBF.HeaderBBox bbox = 1;</code>
     */
    org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBoxOrBuilder getBboxOrBuilder();

    /**
     * <pre>
     * Additional tags to aid in parsing this dataset 
     * </pre>
     *
     * <code>repeated string required_features = 4;</code>
     * @return A list containing the requiredFeatures.
     */
    java.util.List<java.lang.String>
        getRequiredFeaturesList();
    /**
     * <pre>
     * Additional tags to aid in parsing this dataset 
     * </pre>
     *
     * <code>repeated string required_features = 4;</code>
     * @return The count of requiredFeatures.
     */
    int getRequiredFeaturesCount();
    /**
     * <pre>
     * Additional tags to aid in parsing this dataset 
     * </pre>
     *
     * <code>repeated string required_features = 4;</code>
     * @param index The index of the element to return.
     * @return The requiredFeatures at the given index.
     */
    java.lang.String getRequiredFeatures(int index);
    /**
     * <pre>
     * Additional tags to aid in parsing this dataset 
     * </pre>
     *
     * <code>repeated string required_features = 4;</code>
     * @param index The index of the value to return.
     * @return The bytes of the requiredFeatures at the given index.
     */
    com.google.protobuf.ByteString
        getRequiredFeaturesBytes(int index);

    /**
     * <code>repeated string optional_features = 5;</code>
     * @return A list containing the optionalFeatures.
     */
    java.util.List<java.lang.String>
        getOptionalFeaturesList();
    /**
     * <code>repeated string optional_features = 5;</code>
     * @return The count of optionalFeatures.
     */
    int getOptionalFeaturesCount();
    /**
     * <code>repeated string optional_features = 5;</code>
     * @param index The index of the element to return.
     * @return The optionalFeatures at the given index.
     */
    java.lang.String getOptionalFeatures(int index);
    /**
     * <code>repeated string optional_features = 5;</code>
     * @param index The index of the value to return.
     * @return The bytes of the optionalFeatures at the given index.
     */
    com.google.protobuf.ByteString
        getOptionalFeaturesBytes(int index);

    /**
     * <code>optional string writingprogram = 16;</code>
     * @return Whether the writingprogram field is set.
     */
    boolean hasWritingprogram();
    /**
     * <code>optional string writingprogram = 16;</code>
     * @return The writingprogram.
     */
    java.lang.String getWritingprogram();
    /**
     * <code>optional string writingprogram = 16;</code>
     * @return The bytes for writingprogram.
     */
    com.google.protobuf.ByteString
        getWritingprogramBytes();

    /**
     * <pre>
     * From the bbox field.
     * </pre>
     *
     * <code>optional string source = 17;</code>
     * @return Whether the source field is set.
     */
    boolean hasSource();
    /**
     * <pre>
     * From the bbox field.
     * </pre>
     *
     * <code>optional string source = 17;</code>
     * @return The source.
     */
    java.lang.String getSource();
    /**
     * <pre>
     * From the bbox field.
     * </pre>
     *
     * <code>optional string source = 17;</code>
     * @return The bytes for source.
     */
    com.google.protobuf.ByteString
        getSourceBytes();

    /**
     * <pre>
     * replication timestamp, expressed in seconds since the epoch, 
     * otherwise the same value as in the "timestamp=..." field
     * in the state.txt file used by Osmosis
     * </pre>
     *
     * <code>optional int64 osmosis_replication_timestamp = 32;</code>
     * @return Whether the osmosisReplicationTimestamp field is set.
     */
    boolean hasOsmosisReplicationTimestamp();
    /**
     * <pre>
     * replication timestamp, expressed in seconds since the epoch, 
     * otherwise the same value as in the "timestamp=..." field
     * in the state.txt file used by Osmosis
     * </pre>
     *
     * <code>optional int64 osmosis_replication_timestamp = 32;</code>
     * @return The osmosisReplicationTimestamp.
     */
    long getOsmosisReplicationTimestamp();

    /**
     * <pre>
     * replication sequence number (sequenceNumber in state.txt)
     * </pre>
     *
     * <code>optional int64 osmosis_replication_sequence_number = 33;</code>
     * @return Whether the osmosisReplicationSequenceNumber field is set.
     */
    boolean hasOsmosisReplicationSequenceNumber();
    /**
     * <pre>
     * replication sequence number (sequenceNumber in state.txt)
     * </pre>
     *
     * <code>optional int64 osmosis_replication_sequence_number = 33;</code>
     * @return The osmosisReplicationSequenceNumber.
     */
    long getOsmosisReplicationSequenceNumber();

    /**
     * <pre>
     * replication base URL (from Osmosis' configuration.txt file)
     * </pre>
     *
     * <code>optional string osmosis_replication_base_url = 34;</code>
     * @return Whether the osmosisReplicationBaseUrl field is set.
     */
    boolean hasOsmosisReplicationBaseUrl();
    /**
     * <pre>
     * replication base URL (from Osmosis' configuration.txt file)
     * </pre>
     *
     * <code>optional string osmosis_replication_base_url = 34;</code>
     * @return The osmosisReplicationBaseUrl.
     */
    java.lang.String getOsmosisReplicationBaseUrl();
    /**
     * <pre>
     * replication base URL (from Osmosis' configuration.txt file)
     * </pre>
     *
     * <code>optional string osmosis_replication_base_url = 34;</code>
     * @return The bytes for osmosisReplicationBaseUrl.
     */
    com.google.protobuf.ByteString
        getOsmosisReplicationBaseUrlBytes();
  }
  /**
   * Protobuf type {@code OSMPBF.HeaderBlock}
   */
  public static final class HeaderBlock extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:OSMPBF.HeaderBlock)
      HeaderBlockOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use HeaderBlock.newBuilder() to construct.
    private HeaderBlock(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private HeaderBlock() {
      requiredFeatures_ = com.google.protobuf.LazyStringArrayList.EMPTY;
      optionalFeatures_ = com.google.protobuf.LazyStringArrayList.EMPTY;
      writingprogram_ = "";
      source_ = "";
      osmosisReplicationBaseUrl_ = "";
    }

    @java.lang.Override
    @SuppressWarnings({"unused"})
    protected java.lang.Object newInstance(
        UnusedPrivateParameter unused) {
      return new HeaderBlock();
    }

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    private HeaderBlock(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      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;
            case 10: {
              org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox.Builder subBuilder = null;
              if (((bitField0_ & 0x00000001) != 0)) {
                subBuilder = bbox_.toBuilder();
              }
              bbox_ = input.readMessage(org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(bbox_);
                bbox_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000001;
              break;
            }
            case 34: {
              com.google.protobuf.ByteString bs = input.readBytes();
              if (!((mutable_bitField0_ & 0x00000002) != 0)) {
                requiredFeatures_ = new com.google.protobuf.LazyStringArrayList();
                mutable_bitField0_ |= 0x00000002;
              }
              requiredFeatures_.add(bs);
              break;
            }
            case 42: {
              com.google.protobuf.ByteString bs = input.readBytes();
              if (!((mutable_bitField0_ & 0x00000004) != 0)) {
                optionalFeatures_ = new com.google.protobuf.LazyStringArrayList();
                mutable_bitField0_ |= 0x00000004;
              }
              optionalFeatures_.add(bs);
              break;
            }
            case 130: {
              com.google.protobuf.ByteString bs = input.readBytes();
              bitField0_ |= 0x00000002;
              writingprogram_ = bs;
              break;
            }
            case 138: {
              com.google.protobuf.ByteString bs = input.readBytes();
              bitField0_ |= 0x00000004;
              source_ = bs;
              break;
            }
            case 256: {
              bitField0_ |= 0x00000008;
              osmosisReplicationTimestamp_ = input.readInt64();
              break;
            }
            case 264: {
              bitField0_ |= 0x00000010;
              osmosisReplicationSequenceNumber_ = input.readInt64();
              break;
            }
            case 274: {
              com.google.protobuf.ByteString bs = input.readBytes();
              bitField0_ |= 0x00000020;
              osmosisReplicationBaseUrl_ = bs;
              break;
            }
            default: {
              if (!parseUnknownField(
                  input, unknownFields, extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e).setUnfinishedMessage(this);
      } finally {
        if (((mutable_bitField0_ & 0x00000002) != 0)) {
          requiredFeatures_ = requiredFeatures_.getUnmodifiableView();
        }
        if (((mutable_bitField0_ & 0x00000004) != 0)) {
          optionalFeatures_ = optionalFeatures_.getUnmodifiableView();
        }
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_HeaderBlock_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_HeaderBlock_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBlock.class, org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBlock.Builder.class);
    }

    private int bitField0_;
    public static final int BBOX_FIELD_NUMBER = 1;
    private org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox bbox_;
    /**
     * <code>optional .OSMPBF.HeaderBBox bbox = 1;</code>
     * @return Whether the bbox field is set.
     */
    @java.lang.Override
    public boolean hasBbox() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <code>optional .OSMPBF.HeaderBBox bbox = 1;</code>
     * @return The bbox.
     */
    @java.lang.Override
    public org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox getBbox() {
      return bbox_ == null ? org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox.getDefaultInstance() : bbox_;
    }
    /**
     * <code>optional .OSMPBF.HeaderBBox bbox = 1;</code>
     */
    @java.lang.Override
    public org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBoxOrBuilder getBboxOrBuilder() {
      return bbox_ == null ? org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox.getDefaultInstance() : bbox_;
    }

    public static final int REQUIRED_FEATURES_FIELD_NUMBER = 4;
    private com.google.protobuf.LazyStringList requiredFeatures_;
    /**
     * <pre>
     * Additional tags to aid in parsing this dataset 
     * </pre>
     *
     * <code>repeated string required_features = 4;</code>
     * @return A list containing the requiredFeatures.
     */
    public com.google.protobuf.ProtocolStringList
        getRequiredFeaturesList() {
      return requiredFeatures_;
    }
    /**
     * <pre>
     * Additional tags to aid in parsing this dataset 
     * </pre>
     *
     * <code>repeated string required_features = 4;</code>
     * @return The count of requiredFeatures.
     */
    public int getRequiredFeaturesCount() {
      return requiredFeatures_.size();
    }
    /**
     * <pre>
     * Additional tags to aid in parsing this dataset 
     * </pre>
     *
     * <code>repeated string required_features = 4;</code>
     * @param index The index of the element to return.
     * @return The requiredFeatures at the given index.
     */
    public java.lang.String getRequiredFeatures(int index) {
      return requiredFeatures_.get(index);
    }
    /**
     * <pre>
     * Additional tags to aid in parsing this dataset 
     * </pre>
     *
     * <code>repeated string required_features = 4;</code>
     * @param index The index of the value to return.
     * @return The bytes of the requiredFeatures at the given index.
     */
    public com.google.protobuf.ByteString
        getRequiredFeaturesBytes(int index) {
      return requiredFeatures_.getByteString(index);
    }

    public static final int OPTIONAL_FEATURES_FIELD_NUMBER = 5;
    private com.google.protobuf.LazyStringList optionalFeatures_;
    /**
     * <code>repeated string optional_features = 5;</code>
     * @return A list containing the optionalFeatures.
     */
    public com.google.protobuf.ProtocolStringList
        getOptionalFeaturesList() {
      return optionalFeatures_;
    }
    /**
     * <code>repeated string optional_features = 5;</code>
     * @return The count of optionalFeatures.
     */
    public int getOptionalFeaturesCount() {
      return optionalFeatures_.size();
    }
    /**
     * <code>repeated string optional_features = 5;</code>
     * @param index The index of the element to return.
     * @return The optionalFeatures at the given index.
     */
    public java.lang.String getOptionalFeatures(int index) {
      return optionalFeatures_.get(index);
    }
    /**
     * <code>repeated string optional_features = 5;</code>
     * @param index The index of the value to return.
     * @return The bytes of the optionalFeatures at the given index.
     */
    public com.google.protobuf.ByteString
        getOptionalFeaturesBytes(int index) {
      return optionalFeatures_.getByteString(index);
    }

    public static final int WRITINGPROGRAM_FIELD_NUMBER = 16;
    private volatile java.lang.Object writingprogram_;
    /**
     * <code>optional string writingprogram = 16;</code>
     * @return Whether the writingprogram field is set.
     */
    @java.lang.Override
    public boolean hasWritingprogram() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <code>optional string writingprogram = 16;</code>
     * @return The writingprogram.
     */
    @java.lang.Override
    public java.lang.String getWritingprogram() {
      java.lang.Object ref = writingprogram_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          writingprogram_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string writingprogram = 16;</code>
     * @return The bytes for writingprogram.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getWritingprogramBytes() {
      java.lang.Object ref = writingprogram_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        writingprogram_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int SOURCE_FIELD_NUMBER = 17;
    private volatile java.lang.Object source_;
    /**
     * <pre>
     * From the bbox field.
     * </pre>
     *
     * <code>optional string source = 17;</code>
     * @return Whether the source field is set.
     */
    @java.lang.Override
    public boolean hasSource() {
      return ((bitField0_ & 0x00000004) != 0);
    }
    /**
     * <pre>
     * From the bbox field.
     * </pre>
     *
     * <code>optional string source = 17;</code>
     * @return The source.
     */
    @java.lang.Override
    public java.lang.String getSource() {
      java.lang.Object ref = source_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          source_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * From the bbox field.
     * </pre>
     *
     * <code>optional string source = 17;</code>
     * @return The bytes for source.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getSourceBytes() {
      java.lang.Object ref = source_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        source_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int OSMOSIS_REPLICATION_TIMESTAMP_FIELD_NUMBER = 32;
    private long osmosisReplicationTimestamp_;
    /**
     * <pre>
     * replication timestamp, expressed in seconds since the epoch, 
     * otherwise the same value as in the "timestamp=..." field
     * in the state.txt file used by Osmosis
     * </pre>
     *
     * <code>optional int64 osmosis_replication_timestamp = 32;</code>
     * @return Whether the osmosisReplicationTimestamp field is set.
     */
    @java.lang.Override
    public boolean hasOsmosisReplicationTimestamp() {
      return ((bitField0_ & 0x00000008) != 0);
    }
    /**
     * <pre>
     * replication timestamp, expressed in seconds since the epoch, 
     * otherwise the same value as in the "timestamp=..." field
     * in the state.txt file used by Osmosis
     * </pre>
     *
     * <code>optional int64 osmosis_replication_timestamp = 32;</code>
     * @return The osmosisReplicationTimestamp.
     */
    @java.lang.Override
    public long getOsmosisReplicationTimestamp() {
      return osmosisReplicationTimestamp_;
    }

    public static final int OSMOSIS_REPLICATION_SEQUENCE_NUMBER_FIELD_NUMBER = 33;
    private long osmosisReplicationSequenceNumber_;
    /**
     * <pre>
     * replication sequence number (sequenceNumber in state.txt)
     * </pre>
     *
     * <code>optional int64 osmosis_replication_sequence_number = 33;</code>
     * @return Whether the osmosisReplicationSequenceNumber field is set.
     */
    @java.lang.Override
    public boolean hasOsmosisReplicationSequenceNumber() {
      return ((bitField0_ & 0x00000010) != 0);
    }
    /**
     * <pre>
     * replication sequence number (sequenceNumber in state.txt)
     * </pre>
     *
     * <code>optional int64 osmosis_replication_sequence_number = 33;</code>
     * @return The osmosisReplicationSequenceNumber.
     */
    @java.lang.Override
    public long getOsmosisReplicationSequenceNumber() {
      return osmosisReplicationSequenceNumber_;
    }

    public static final int OSMOSIS_REPLICATION_BASE_URL_FIELD_NUMBER = 34;
    private volatile java.lang.Object osmosisReplicationBaseUrl_;
    /**
     * <pre>
     * replication base URL (from Osmosis' configuration.txt file)
     * </pre>
     *
     * <code>optional string osmosis_replication_base_url = 34;</code>
     * @return Whether the osmosisReplicationBaseUrl field is set.
     */
    @java.lang.Override
    public boolean hasOsmosisReplicationBaseUrl() {
      return ((bitField0_ & 0x00000020) != 0);
    }
    /**
     * <pre>
     * replication base URL (from Osmosis' configuration.txt file)
     * </pre>
     *
     * <code>optional string osmosis_replication_base_url = 34;</code>
     * @return The osmosisReplicationBaseUrl.
     */
    @java.lang.Override
    public java.lang.String getOsmosisReplicationBaseUrl() {
      java.lang.Object ref = osmosisReplicationBaseUrl_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          osmosisReplicationBaseUrl_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * replication base URL (from Osmosis' configuration.txt file)
     * </pre>
     *
     * <code>optional string osmosis_replication_base_url = 34;</code>
     * @return The bytes for osmosisReplicationBaseUrl.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getOsmosisReplicationBaseUrlBytes() {
      java.lang.Object ref = osmosisReplicationBaseUrl_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        osmosisReplicationBaseUrl_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    private byte memoizedIsInitialized = -1;
    @java.lang.Override
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized == 1) return true;
      if (isInitialized == 0) return false;

      if (hasBbox()) {
        if (!getBbox().isInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
      }
      memoizedIsInitialized = 1;
      return true;
    }

    @java.lang.Override
    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      if (((bitField0_ & 0x00000001) != 0)) {
        output.writeMessage(1, getBbox());
      }
      for (int i = 0; i < requiredFeatures_.size(); i++) {
        com.google.protobuf.GeneratedMessageV3.writeString(output, 4, requiredFeatures_.getRaw(i));
      }
      for (int i = 0; i < optionalFeatures_.size(); i++) {
        com.google.protobuf.GeneratedMessageV3.writeString(output, 5, optionalFeatures_.getRaw(i));
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        com.google.protobuf.GeneratedMessageV3.writeString(output, 16, writingprogram_);
      }
      if (((bitField0_ & 0x00000004) != 0)) {
        com.google.protobuf.GeneratedMessageV3.writeString(output, 17, source_);
      }
      if (((bitField0_ & 0x00000008) != 0)) {
        output.writeInt64(32, osmosisReplicationTimestamp_);
      }
      if (((bitField0_ & 0x00000010) != 0)) {
        output.writeInt64(33, osmosisReplicationSequenceNumber_);
      }
      if (((bitField0_ & 0x00000020) != 0)) {
        com.google.protobuf.GeneratedMessageV3.writeString(output, 34, osmosisReplicationBaseUrl_);
      }
      unknownFields.writeTo(output);
    }

    @java.lang.Override
    public int getSerializedSize() {
      int size = memoizedSize;
      if (size != -1) return size;

      size = 0;
      if (((bitField0_ & 0x00000001) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(1, getBbox());
      }
      {
        int dataSize = 0;
        for (int i = 0; i < requiredFeatures_.size(); i++) {
          dataSize += computeStringSizeNoTag(requiredFeatures_.getRaw(i));
        }
        size += dataSize;
        size += 1 * getRequiredFeaturesList().size();
      }
      {
        int dataSize = 0;
        for (int i = 0; i < optionalFeatures_.size(); i++) {
          dataSize += computeStringSizeNoTag(optionalFeatures_.getRaw(i));
        }
        size += dataSize;
        size += 1 * getOptionalFeaturesList().size();
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(16, writingprogram_);
      }
      if (((bitField0_ & 0x00000004) != 0)) {
        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(17, source_);
      }
      if (((bitField0_ & 0x00000008) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt64Size(32, osmosisReplicationTimestamp_);
      }
      if (((bitField0_ & 0x00000010) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt64Size(33, osmosisReplicationSequenceNumber_);
      }
      if (((bitField0_ & 0x00000020) != 0)) {
        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(34, osmosisReplicationBaseUrl_);
      }
      size += unknownFields.getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @java.lang.Override
    public boolean equals(final java.lang.Object obj) {
      if (obj == this) {
       return true;
      }
      if (!(obj instanceof org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBlock)) {
        return super.equals(obj);
      }
      org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBlock other = (org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBlock) obj;

      if (hasBbox() != other.hasBbox()) return false;
      if (hasBbox()) {
        if (!getBbox()
            .equals(other.getBbox())) return false;
      }
      if (!getRequiredFeaturesList()
          .equals(other.getRequiredFeaturesList())) return false;
      if (!getOptionalFeaturesList()
          .equals(other.getOptionalFeaturesList())) return false;
      if (hasWritingprogram() != other.hasWritingprogram()) return false;
      if (hasWritingprogram()) {
        if (!getWritingprogram()
            .equals(other.getWritingprogram())) return false;
      }
      if (hasSource() != other.hasSource()) return false;
      if (hasSource()) {
        if (!getSource()
            .equals(other.getSource())) return false;
      }
      if (hasOsmosisReplicationTimestamp() != other.hasOsmosisReplicationTimestamp()) return false;
      if (hasOsmosisReplicationTimestamp()) {
        if (getOsmosisReplicationTimestamp()
            != other.getOsmosisReplicationTimestamp()) return false;
      }
      if (hasOsmosisReplicationSequenceNumber() != other.hasOsmosisReplicationSequenceNumber()) return false;
      if (hasOsmosisReplicationSequenceNumber()) {
        if (getOsmosisReplicationSequenceNumber()
            != other.getOsmosisReplicationSequenceNumber()) return false;
      }
      if (hasOsmosisReplicationBaseUrl() != other.hasOsmosisReplicationBaseUrl()) return false;
      if (hasOsmosisReplicationBaseUrl()) {
        if (!getOsmosisReplicationBaseUrl()
            .equals(other.getOsmosisReplicationBaseUrl())) return false;
      }
      if (!unknownFields.equals(other.unknownFields)) return false;
      return true;
    }

    @java.lang.Override
    public int hashCode() {
      if (memoizedHashCode != 0) {
        return memoizedHashCode;
      }
      int hash = 41;
      hash = (19 * hash) + getDescriptor().hashCode();
      if (hasBbox()) {
        hash = (37 * hash) + BBOX_FIELD_NUMBER;
        hash = (53 * hash) + getBbox().hashCode();
      }
      if (getRequiredFeaturesCount() > 0) {
        hash = (37 * hash) + REQUIRED_FEATURES_FIELD_NUMBER;
        hash = (53 * hash) + getRequiredFeaturesList().hashCode();
      }
      if (getOptionalFeaturesCount() > 0) {
        hash = (37 * hash) + OPTIONAL_FEATURES_FIELD_NUMBER;
        hash = (53 * hash) + getOptionalFeaturesList().hashCode();
      }
      if (hasWritingprogram()) {
        hash = (37 * hash) + WRITINGPROGRAM_FIELD_NUMBER;
        hash = (53 * hash) + getWritingprogram().hashCode();
      }
      if (hasSource()) {
        hash = (37 * hash) + SOURCE_FIELD_NUMBER;
        hash = (53 * hash) + getSource().hashCode();
      }
      if (hasOsmosisReplicationTimestamp()) {
        hash = (37 * hash) + OSMOSIS_REPLICATION_TIMESTAMP_FIELD_NUMBER;
        hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
            getOsmosisReplicationTimestamp());
      }
      if (hasOsmosisReplicationSequenceNumber()) {
        hash = (37 * hash) + OSMOSIS_REPLICATION_SEQUENCE_NUMBER_FIELD_NUMBER;
        hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
            getOsmosisReplicationSequenceNumber());
      }
      if (hasOsmosisReplicationBaseUrl()) {
        hash = (37 * hash) + OSMOSIS_REPLICATION_BASE_URL_FIELD_NUMBER;
        hash = (53 * hash) + getOsmosisReplicationBaseUrl().hashCode();
      }
      hash = (29 * hash) + unknownFields.hashCode();
      memoizedHashCode = hash;
      return hash;
    }

    public static org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBlock parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBlock parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBlock parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBlock parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBlock parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBlock parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBlock parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBlock parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBlock parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBlock parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBlock parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBlock parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @java.lang.Override
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }
    public static Builder newBuilder(org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBlock prototype) {
      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
    }
    @java.lang.Override
    public Builder toBuilder() {
      return this == DEFAULT_INSTANCE
          ? new Builder() : new Builder().mergeFrom(this);
    }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code OSMPBF.HeaderBlock}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:OSMPBF.HeaderBlock)
        org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBlockOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_HeaderBlock_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_HeaderBlock_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBlock.class, org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBlock.Builder.class);
      }

      // Construct using org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBlock.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
          getBboxFieldBuilder();
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        if (bboxBuilder_ == null) {
          bbox_ = null;
        } else {
          bboxBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000001);
        requiredFeatures_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        bitField0_ = (bitField0_ & ~0x00000002);
        optionalFeatures_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        bitField0_ = (bitField0_ & ~0x00000004);
        writingprogram_ = "";
        bitField0_ = (bitField0_ & ~0x00000008);
        source_ = "";
        bitField0_ = (bitField0_ & ~0x00000010);
        osmosisReplicationTimestamp_ = 0L;
        bitField0_ = (bitField0_ & ~0x00000020);
        osmosisReplicationSequenceNumber_ = 0L;
        bitField0_ = (bitField0_ & ~0x00000040);
        osmosisReplicationBaseUrl_ = "";
        bitField0_ = (bitField0_ & ~0x00000080);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_HeaderBlock_descriptor;
      }

      @java.lang.Override
      public org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBlock getDefaultInstanceForType() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBlock.getDefaultInstance();
      }

      @java.lang.Override
      public org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBlock build() {
        org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBlock result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBlock buildPartial() {
        org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBlock result = new org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBlock(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          if (bboxBuilder_ == null) {
            result.bbox_ = bbox_;
          } else {
            result.bbox_ = bboxBuilder_.build();
          }
          to_bitField0_ |= 0x00000001;
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          requiredFeatures_ = requiredFeatures_.getUnmodifiableView();
          bitField0_ = (bitField0_ & ~0x00000002);
        }
        result.requiredFeatures_ = requiredFeatures_;
        if (((bitField0_ & 0x00000004) != 0)) {
          optionalFeatures_ = optionalFeatures_.getUnmodifiableView();
          bitField0_ = (bitField0_ & ~0x00000004);
        }
        result.optionalFeatures_ = optionalFeatures_;
        if (((from_bitField0_ & 0x00000008) != 0)) {
          to_bitField0_ |= 0x00000002;
        }
        result.writingprogram_ = writingprogram_;
        if (((from_bitField0_ & 0x00000010) != 0)) {
          to_bitField0_ |= 0x00000004;
        }
        result.source_ = source_;
        if (((from_bitField0_ & 0x00000020) != 0)) {
          result.osmosisReplicationTimestamp_ = osmosisReplicationTimestamp_;
          to_bitField0_ |= 0x00000008;
        }
        if (((from_bitField0_ & 0x00000040) != 0)) {
          result.osmosisReplicationSequenceNumber_ = osmosisReplicationSequenceNumber_;
          to_bitField0_ |= 0x00000010;
        }
        if (((from_bitField0_ & 0x00000080) != 0)) {
          to_bitField0_ |= 0x00000020;
        }
        result.osmosisReplicationBaseUrl_ = osmosisReplicationBaseUrl_;
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      @java.lang.Override
      public Builder clone() {
        return super.clone();
      }
      @java.lang.Override
      public Builder setField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.setField(field, value);
      }
      @java.lang.Override
      public Builder clearField(
          com.google.protobuf.Descriptors.FieldDescriptor field) {
        return super.clearField(field);
      }
      @java.lang.Override
      public Builder clearOneof(
          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
        return super.clearOneof(oneof);
      }
      @java.lang.Override
      public Builder setRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          int index, java.lang.Object value) {
        return super.setRepeatedField(field, index, value);
      }
      @java.lang.Override
      public Builder addRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.addRepeatedField(field, value);
      }
      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBlock) {
          return mergeFrom((org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBlock)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBlock other) {
        if (other == org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBlock.getDefaultInstance()) return this;
        if (other.hasBbox()) {
          mergeBbox(other.getBbox());
        }
        if (!other.requiredFeatures_.isEmpty()) {
          if (requiredFeatures_.isEmpty()) {
            requiredFeatures_ = other.requiredFeatures_;
            bitField0_ = (bitField0_ & ~0x00000002);
          } else {
            ensureRequiredFeaturesIsMutable();
            requiredFeatures_.addAll(other.requiredFeatures_);
          }
          onChanged();
        }
        if (!other.optionalFeatures_.isEmpty()) {
          if (optionalFeatures_.isEmpty()) {
            optionalFeatures_ = other.optionalFeatures_;
            bitField0_ = (bitField0_ & ~0x00000004);
          } else {
            ensureOptionalFeaturesIsMutable();
            optionalFeatures_.addAll(other.optionalFeatures_);
          }
          onChanged();
        }
        if (other.hasWritingprogram()) {
          bitField0_ |= 0x00000008;
          writingprogram_ = other.writingprogram_;
          onChanged();
        }
        if (other.hasSource()) {
          bitField0_ |= 0x00000010;
          source_ = other.source_;
          onChanged();
        }
        if (other.hasOsmosisReplicationTimestamp()) {
          setOsmosisReplicationTimestamp(other.getOsmosisReplicationTimestamp());
        }
        if (other.hasOsmosisReplicationSequenceNumber()) {
          setOsmosisReplicationSequenceNumber(other.getOsmosisReplicationSequenceNumber());
        }
        if (other.hasOsmosisReplicationBaseUrl()) {
          bitField0_ |= 0x00000080;
          osmosisReplicationBaseUrl_ = other.osmosisReplicationBaseUrl_;
          onChanged();
        }
        this.mergeUnknownFields(other.unknownFields);
        onChanged();
        return this;
      }

      @java.lang.Override
      public final boolean isInitialized() {
        if (hasBbox()) {
          if (!getBbox().isInitialized()) {
            return false;
          }
        }
        return true;
      }

      @java.lang.Override
      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBlock parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBlock) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      private org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox bbox_;
      private com.google.protobuf.SingleFieldBuilderV3<
          org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox, org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox.Builder, org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBoxOrBuilder> bboxBuilder_;
      /**
       * <code>optional .OSMPBF.HeaderBBox bbox = 1;</code>
       * @return Whether the bbox field is set.
       */
      public boolean hasBbox() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <code>optional .OSMPBF.HeaderBBox bbox = 1;</code>
       * @return The bbox.
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox getBbox() {
        if (bboxBuilder_ == null) {
          return bbox_ == null ? org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox.getDefaultInstance() : bbox_;
        } else {
          return bboxBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .OSMPBF.HeaderBBox bbox = 1;</code>
       */
      public Builder setBbox(org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox value) {
        if (bboxBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          bbox_ = value;
          onChanged();
        } else {
          bboxBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * <code>optional .OSMPBF.HeaderBBox bbox = 1;</code>
       */
      public Builder setBbox(
          org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox.Builder builderForValue) {
        if (bboxBuilder_ == null) {
          bbox_ = builderForValue.build();
          onChanged();
        } else {
          bboxBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * <code>optional .OSMPBF.HeaderBBox bbox = 1;</code>
       */
      public Builder mergeBbox(org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox value) {
        if (bboxBuilder_ == null) {
          if (((bitField0_ & 0x00000001) != 0) &&
              bbox_ != null &&
              bbox_ != org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox.getDefaultInstance()) {
            bbox_ =
              org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox.newBuilder(bbox_).mergeFrom(value).buildPartial();
          } else {
            bbox_ = value;
          }
          onChanged();
        } else {
          bboxBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * <code>optional .OSMPBF.HeaderBBox bbox = 1;</code>
       */
      public Builder clearBbox() {
        if (bboxBuilder_ == null) {
          bbox_ = null;
          onChanged();
        } else {
          bboxBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000001);
        return this;
      }
      /**
       * <code>optional .OSMPBF.HeaderBBox bbox = 1;</code>
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox.Builder getBboxBuilder() {
        bitField0_ |= 0x00000001;
        onChanged();
        return getBboxFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .OSMPBF.HeaderBBox bbox = 1;</code>
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBoxOrBuilder getBboxOrBuilder() {
        if (bboxBuilder_ != null) {
          return bboxBuilder_.getMessageOrBuilder();
        } else {
          return bbox_ == null ?
              org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox.getDefaultInstance() : bbox_;
        }
      }
      /**
       * <code>optional .OSMPBF.HeaderBBox bbox = 1;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox, org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox.Builder, org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBoxOrBuilder> 
          getBboxFieldBuilder() {
        if (bboxBuilder_ == null) {
          bboxBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox, org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox.Builder, org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBoxOrBuilder>(
                  getBbox(),
                  getParentForChildren(),
                  isClean());
          bbox_ = null;
        }
        return bboxBuilder_;
      }

      private com.google.protobuf.LazyStringList requiredFeatures_ = com.google.protobuf.LazyStringArrayList.EMPTY;
      private void ensureRequiredFeaturesIsMutable() {
        if (!((bitField0_ & 0x00000002) != 0)) {
          requiredFeatures_ = new com.google.protobuf.LazyStringArrayList(requiredFeatures_);
          bitField0_ |= 0x00000002;
         }
      }
      /**
       * <pre>
       * Additional tags to aid in parsing this dataset 
       * </pre>
       *
       * <code>repeated string required_features = 4;</code>
       * @return A list containing the requiredFeatures.
       */
      public com.google.protobuf.ProtocolStringList
          getRequiredFeaturesList() {
        return requiredFeatures_.getUnmodifiableView();
      }
      /**
       * <pre>
       * Additional tags to aid in parsing this dataset 
       * </pre>
       *
       * <code>repeated string required_features = 4;</code>
       * @return The count of requiredFeatures.
       */
      public int getRequiredFeaturesCount() {
        return requiredFeatures_.size();
      }
      /**
       * <pre>
       * Additional tags to aid in parsing this dataset 
       * </pre>
       *
       * <code>repeated string required_features = 4;</code>
       * @param index The index of the element to return.
       * @return The requiredFeatures at the given index.
       */
      public java.lang.String getRequiredFeatures(int index) {
        return requiredFeatures_.get(index);
      }
      /**
       * <pre>
       * Additional tags to aid in parsing this dataset 
       * </pre>
       *
       * <code>repeated string required_features = 4;</code>
       * @param index The index of the value to return.
       * @return The bytes of the requiredFeatures at the given index.
       */
      public com.google.protobuf.ByteString
          getRequiredFeaturesBytes(int index) {
        return requiredFeatures_.getByteString(index);
      }
      /**
       * <pre>
       * Additional tags to aid in parsing this dataset 
       * </pre>
       *
       * <code>repeated string required_features = 4;</code>
       * @param index The index to set the value at.
       * @param value The requiredFeatures to set.
       * @return This builder for chaining.
       */
      public Builder setRequiredFeatures(
          int index, java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureRequiredFeaturesIsMutable();
        requiredFeatures_.set(index, value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Additional tags to aid in parsing this dataset 
       * </pre>
       *
       * <code>repeated string required_features = 4;</code>
       * @param value The requiredFeatures to add.
       * @return This builder for chaining.
       */
      public Builder addRequiredFeatures(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureRequiredFeaturesIsMutable();
        requiredFeatures_.add(value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Additional tags to aid in parsing this dataset 
       * </pre>
       *
       * <code>repeated string required_features = 4;</code>
       * @param values The requiredFeatures to add.
       * @return This builder for chaining.
       */
      public Builder addAllRequiredFeatures(
          java.lang.Iterable<java.lang.String> values) {
        ensureRequiredFeaturesIsMutable();
        com.google.protobuf.AbstractMessageLite.Builder.addAll(
            values, requiredFeatures_);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Additional tags to aid in parsing this dataset 
       * </pre>
       *
       * <code>repeated string required_features = 4;</code>
       * @return This builder for chaining.
       */
      public Builder clearRequiredFeatures() {
        requiredFeatures_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        bitField0_ = (bitField0_ & ~0x00000002);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Additional tags to aid in parsing this dataset 
       * </pre>
       *
       * <code>repeated string required_features = 4;</code>
       * @param value The bytes of the requiredFeatures to add.
       * @return This builder for chaining.
       */
      public Builder addRequiredFeaturesBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureRequiredFeaturesIsMutable();
        requiredFeatures_.add(value);
        onChanged();
        return this;
      }

      private com.google.protobuf.LazyStringList optionalFeatures_ = com.google.protobuf.LazyStringArrayList.EMPTY;
      private void ensureOptionalFeaturesIsMutable() {
        if (!((bitField0_ & 0x00000004) != 0)) {
          optionalFeatures_ = new com.google.protobuf.LazyStringArrayList(optionalFeatures_);
          bitField0_ |= 0x00000004;
         }
      }
      /**
       * <code>repeated string optional_features = 5;</code>
       * @return A list containing the optionalFeatures.
       */
      public com.google.protobuf.ProtocolStringList
          getOptionalFeaturesList() {
        return optionalFeatures_.getUnmodifiableView();
      }
      /**
       * <code>repeated string optional_features = 5;</code>
       * @return The count of optionalFeatures.
       */
      public int getOptionalFeaturesCount() {
        return optionalFeatures_.size();
      }
      /**
       * <code>repeated string optional_features = 5;</code>
       * @param index The index of the element to return.
       * @return The optionalFeatures at the given index.
       */
      public java.lang.String getOptionalFeatures(int index) {
        return optionalFeatures_.get(index);
      }
      /**
       * <code>repeated string optional_features = 5;</code>
       * @param index The index of the value to return.
       * @return The bytes of the optionalFeatures at the given index.
       */
      public com.google.protobuf.ByteString
          getOptionalFeaturesBytes(int index) {
        return optionalFeatures_.getByteString(index);
      }
      /**
       * <code>repeated string optional_features = 5;</code>
       * @param index The index to set the value at.
       * @param value The optionalFeatures to set.
       * @return This builder for chaining.
       */
      public Builder setOptionalFeatures(
          int index, java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureOptionalFeaturesIsMutable();
        optionalFeatures_.set(index, value);
        onChanged();
        return this;
      }
      /**
       * <code>repeated string optional_features = 5;</code>
       * @param value The optionalFeatures to add.
       * @return This builder for chaining.
       */
      public Builder addOptionalFeatures(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureOptionalFeaturesIsMutable();
        optionalFeatures_.add(value);
        onChanged();
        return this;
      }
      /**
       * <code>repeated string optional_features = 5;</code>
       * @param values The optionalFeatures to add.
       * @return This builder for chaining.
       */
      public Builder addAllOptionalFeatures(
          java.lang.Iterable<java.lang.String> values) {
        ensureOptionalFeaturesIsMutable();
        com.google.protobuf.AbstractMessageLite.Builder.addAll(
            values, optionalFeatures_);
        onChanged();
        return this;
      }
      /**
       * <code>repeated string optional_features = 5;</code>
       * @return This builder for chaining.
       */
      public Builder clearOptionalFeatures() {
        optionalFeatures_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        bitField0_ = (bitField0_ & ~0x00000004);
        onChanged();
        return this;
      }
      /**
       * <code>repeated string optional_features = 5;</code>
       * @param value The bytes of the optionalFeatures to add.
       * @return This builder for chaining.
       */
      public Builder addOptionalFeaturesBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureOptionalFeaturesIsMutable();
        optionalFeatures_.add(value);
        onChanged();
        return this;
      }

      private java.lang.Object writingprogram_ = "";
      /**
       * <code>optional string writingprogram = 16;</code>
       * @return Whether the writingprogram field is set.
       */
      public boolean hasWritingprogram() {
        return ((bitField0_ & 0x00000008) != 0);
      }
      /**
       * <code>optional string writingprogram = 16;</code>
       * @return The writingprogram.
       */
      public java.lang.String getWritingprogram() {
        java.lang.Object ref = writingprogram_;
        if (!(ref instanceof java.lang.String)) {
          com.google.protobuf.ByteString bs =
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            writingprogram_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string writingprogram = 16;</code>
       * @return The bytes for writingprogram.
       */
      public com.google.protobuf.ByteString
          getWritingprogramBytes() {
        java.lang.Object ref = writingprogram_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          writingprogram_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string writingprogram = 16;</code>
       * @param value The writingprogram to set.
       * @return This builder for chaining.
       */
      public Builder setWritingprogram(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        writingprogram_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string writingprogram = 16;</code>
       * @return This builder for chaining.
       */
      public Builder clearWritingprogram() {
        bitField0_ = (bitField0_ & ~0x00000008);
        writingprogram_ = getDefaultInstance().getWritingprogram();
        onChanged();
        return this;
      }
      /**
       * <code>optional string writingprogram = 16;</code>
       * @param value The bytes for writingprogram to set.
       * @return This builder for chaining.
       */
      public Builder setWritingprogramBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        writingprogram_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object source_ = "";
      /**
       * <pre>
       * From the bbox field.
       * </pre>
       *
       * <code>optional string source = 17;</code>
       * @return Whether the source field is set.
       */
      public boolean hasSource() {
        return ((bitField0_ & 0x00000010) != 0);
      }
      /**
       * <pre>
       * From the bbox field.
       * </pre>
       *
       * <code>optional string source = 17;</code>
       * @return The source.
       */
      public java.lang.String getSource() {
        java.lang.Object ref = source_;
        if (!(ref instanceof java.lang.String)) {
          com.google.protobuf.ByteString bs =
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            source_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * From the bbox field.
       * </pre>
       *
       * <code>optional string source = 17;</code>
       * @return The bytes for source.
       */
      public com.google.protobuf.ByteString
          getSourceBytes() {
        java.lang.Object ref = source_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          source_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * From the bbox field.
       * </pre>
       *
       * <code>optional string source = 17;</code>
       * @param value The source to set.
       * @return This builder for chaining.
       */
      public Builder setSource(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
        source_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * From the bbox field.
       * </pre>
       *
       * <code>optional string source = 17;</code>
       * @return This builder for chaining.
       */
      public Builder clearSource() {
        bitField0_ = (bitField0_ & ~0x00000010);
        source_ = getDefaultInstance().getSource();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * From the bbox field.
       * </pre>
       *
       * <code>optional string source = 17;</code>
       * @param value The bytes for source to set.
       * @return This builder for chaining.
       */
      public Builder setSourceBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
        source_ = value;
        onChanged();
        return this;
      }

      private long osmosisReplicationTimestamp_ ;
      /**
       * <pre>
       * replication timestamp, expressed in seconds since the epoch, 
       * otherwise the same value as in the "timestamp=..." field
       * in the state.txt file used by Osmosis
       * </pre>
       *
       * <code>optional int64 osmosis_replication_timestamp = 32;</code>
       * @return Whether the osmosisReplicationTimestamp field is set.
       */
      @java.lang.Override
      public boolean hasOsmosisReplicationTimestamp() {
        return ((bitField0_ & 0x00000020) != 0);
      }
      /**
       * <pre>
       * replication timestamp, expressed in seconds since the epoch, 
       * otherwise the same value as in the "timestamp=..." field
       * in the state.txt file used by Osmosis
       * </pre>
       *
       * <code>optional int64 osmosis_replication_timestamp = 32;</code>
       * @return The osmosisReplicationTimestamp.
       */
      @java.lang.Override
      public long getOsmosisReplicationTimestamp() {
        return osmosisReplicationTimestamp_;
      }
      /**
       * <pre>
       * replication timestamp, expressed in seconds since the epoch, 
       * otherwise the same value as in the "timestamp=..." field
       * in the state.txt file used by Osmosis
       * </pre>
       *
       * <code>optional int64 osmosis_replication_timestamp = 32;</code>
       * @param value The osmosisReplicationTimestamp to set.
       * @return This builder for chaining.
       */
      public Builder setOsmosisReplicationTimestamp(long value) {
        bitField0_ |= 0x00000020;
        osmosisReplicationTimestamp_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * replication timestamp, expressed in seconds since the epoch, 
       * otherwise the same value as in the "timestamp=..." field
       * in the state.txt file used by Osmosis
       * </pre>
       *
       * <code>optional int64 osmosis_replication_timestamp = 32;</code>
       * @return This builder for chaining.
       */
      public Builder clearOsmosisReplicationTimestamp() {
        bitField0_ = (bitField0_ & ~0x00000020);
        osmosisReplicationTimestamp_ = 0L;
        onChanged();
        return this;
      }

      private long osmosisReplicationSequenceNumber_ ;
      /**
       * <pre>
       * replication sequence number (sequenceNumber in state.txt)
       * </pre>
       *
       * <code>optional int64 osmosis_replication_sequence_number = 33;</code>
       * @return Whether the osmosisReplicationSequenceNumber field is set.
       */
      @java.lang.Override
      public boolean hasOsmosisReplicationSequenceNumber() {
        return ((bitField0_ & 0x00000040) != 0);
      }
      /**
       * <pre>
       * replication sequence number (sequenceNumber in state.txt)
       * </pre>
       *
       * <code>optional int64 osmosis_replication_sequence_number = 33;</code>
       * @return The osmosisReplicationSequenceNumber.
       */
      @java.lang.Override
      public long getOsmosisReplicationSequenceNumber() {
        return osmosisReplicationSequenceNumber_;
      }
      /**
       * <pre>
       * replication sequence number (sequenceNumber in state.txt)
       * </pre>
       *
       * <code>optional int64 osmosis_replication_sequence_number = 33;</code>
       * @param value The osmosisReplicationSequenceNumber to set.
       * @return This builder for chaining.
       */
      public Builder setOsmosisReplicationSequenceNumber(long value) {
        bitField0_ |= 0x00000040;
        osmosisReplicationSequenceNumber_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * replication sequence number (sequenceNumber in state.txt)
       * </pre>
       *
       * <code>optional int64 osmosis_replication_sequence_number = 33;</code>
       * @return This builder for chaining.
       */
      public Builder clearOsmosisReplicationSequenceNumber() {
        bitField0_ = (bitField0_ & ~0x00000040);
        osmosisReplicationSequenceNumber_ = 0L;
        onChanged();
        return this;
      }

      private java.lang.Object osmosisReplicationBaseUrl_ = "";
      /**
       * <pre>
       * replication base URL (from Osmosis' configuration.txt file)
       * </pre>
       *
       * <code>optional string osmosis_replication_base_url = 34;</code>
       * @return Whether the osmosisReplicationBaseUrl field is set.
       */
      public boolean hasOsmosisReplicationBaseUrl() {
        return ((bitField0_ & 0x00000080) != 0);
      }
      /**
       * <pre>
       * replication base URL (from Osmosis' configuration.txt file)
       * </pre>
       *
       * <code>optional string osmosis_replication_base_url = 34;</code>
       * @return The osmosisReplicationBaseUrl.
       */
      public java.lang.String getOsmosisReplicationBaseUrl() {
        java.lang.Object ref = osmosisReplicationBaseUrl_;
        if (!(ref instanceof java.lang.String)) {
          com.google.protobuf.ByteString bs =
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            osmosisReplicationBaseUrl_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * replication base URL (from Osmosis' configuration.txt file)
       * </pre>
       *
       * <code>optional string osmosis_replication_base_url = 34;</code>
       * @return The bytes for osmosisReplicationBaseUrl.
       */
      public com.google.protobuf.ByteString
          getOsmosisReplicationBaseUrlBytes() {
        java.lang.Object ref = osmosisReplicationBaseUrl_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          osmosisReplicationBaseUrl_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * replication base URL (from Osmosis' configuration.txt file)
       * </pre>
       *
       * <code>optional string osmosis_replication_base_url = 34;</code>
       * @param value The osmosisReplicationBaseUrl to set.
       * @return This builder for chaining.
       */
      public Builder setOsmosisReplicationBaseUrl(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000080;
        osmosisReplicationBaseUrl_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * replication base URL (from Osmosis' configuration.txt file)
       * </pre>
       *
       * <code>optional string osmosis_replication_base_url = 34;</code>
       * @return This builder for chaining.
       */
      public Builder clearOsmosisReplicationBaseUrl() {
        bitField0_ = (bitField0_ & ~0x00000080);
        osmosisReplicationBaseUrl_ = getDefaultInstance().getOsmosisReplicationBaseUrl();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * replication base URL (from Osmosis' configuration.txt file)
       * </pre>
       *
       * <code>optional string osmosis_replication_base_url = 34;</code>
       * @param value The bytes for osmosisReplicationBaseUrl to set.
       * @return This builder for chaining.
       */
      public Builder setOsmosisReplicationBaseUrlBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000080;
        osmosisReplicationBaseUrl_ = value;
        onChanged();
        return this;
      }
      @java.lang.Override
      public final Builder setUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.setUnknownFields(unknownFields);
      }

      @java.lang.Override
      public final Builder mergeUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.mergeUnknownFields(unknownFields);
      }


      // @@protoc_insertion_point(builder_scope:OSMPBF.HeaderBlock)
    }

    // @@protoc_insertion_point(class_scope:OSMPBF.HeaderBlock)
    private static final org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBlock DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBlock();
    }

    public static org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBlock getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    @java.lang.Deprecated public static final com.google.protobuf.Parser<HeaderBlock>
        PARSER = new com.google.protobuf.AbstractParser<HeaderBlock>() {
      @java.lang.Override
      public HeaderBlock parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new HeaderBlock(input, extensionRegistry);
      }
    };

    public static com.google.protobuf.Parser<HeaderBlock> parser() {
      return PARSER;
    }

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

    @java.lang.Override
    public org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBlock getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface HeaderBBoxOrBuilder extends
      // @@protoc_insertion_point(interface_extends:OSMPBF.HeaderBBox)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>required sint64 left = 1;</code>
     * @return Whether the left field is set.
     */
    boolean hasLeft();
    /**
     * <code>required sint64 left = 1;</code>
     * @return The left.
     */
    long getLeft();

    /**
     * <code>required sint64 right = 2;</code>
     * @return Whether the right field is set.
     */
    boolean hasRight();
    /**
     * <code>required sint64 right = 2;</code>
     * @return The right.
     */
    long getRight();

    /**
     * <code>required sint64 top = 3;</code>
     * @return Whether the top field is set.
     */
    boolean hasTop();
    /**
     * <code>required sint64 top = 3;</code>
     * @return The top.
     */
    long getTop();

    /**
     * <code>required sint64 bottom = 4;</code>
     * @return Whether the bottom field is set.
     */
    boolean hasBottom();
    /**
     * <code>required sint64 bottom = 4;</code>
     * @return The bottom.
     */
    long getBottom();
  }
  /**
   * Protobuf type {@code OSMPBF.HeaderBBox}
   */
  public static final class HeaderBBox extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:OSMPBF.HeaderBBox)
      HeaderBBoxOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use HeaderBBox.newBuilder() to construct.
    private HeaderBBox(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private HeaderBBox() {
    }

    @java.lang.Override
    @SuppressWarnings({"unused"})
    protected java.lang.Object newInstance(
        UnusedPrivateParameter unused) {
      return new HeaderBBox();
    }

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    private HeaderBBox(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      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;
            case 8: {
              bitField0_ |= 0x00000001;
              left_ = input.readSInt64();
              break;
            }
            case 16: {
              bitField0_ |= 0x00000002;
              right_ = input.readSInt64();
              break;
            }
            case 24: {
              bitField0_ |= 0x00000004;
              top_ = input.readSInt64();
              break;
            }
            case 32: {
              bitField0_ |= 0x00000008;
              bottom_ = input.readSInt64();
              break;
            }
            default: {
              if (!parseUnknownField(
                  input, unknownFields, extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_HeaderBBox_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_HeaderBBox_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox.class, org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox.Builder.class);
    }

    private int bitField0_;
    public static final int LEFT_FIELD_NUMBER = 1;
    private long left_;
    /**
     * <code>required sint64 left = 1;</code>
     * @return Whether the left field is set.
     */
    @java.lang.Override
    public boolean hasLeft() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <code>required sint64 left = 1;</code>
     * @return The left.
     */
    @java.lang.Override
    public long getLeft() {
      return left_;
    }

    public static final int RIGHT_FIELD_NUMBER = 2;
    private long right_;
    /**
     * <code>required sint64 right = 2;</code>
     * @return Whether the right field is set.
     */
    @java.lang.Override
    public boolean hasRight() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <code>required sint64 right = 2;</code>
     * @return The right.
     */
    @java.lang.Override
    public long getRight() {
      return right_;
    }

    public static final int TOP_FIELD_NUMBER = 3;
    private long top_;
    /**
     * <code>required sint64 top = 3;</code>
     * @return Whether the top field is set.
     */
    @java.lang.Override
    public boolean hasTop() {
      return ((bitField0_ & 0x00000004) != 0);
    }
    /**
     * <code>required sint64 top = 3;</code>
     * @return The top.
     */
    @java.lang.Override
    public long getTop() {
      return top_;
    }

    public static final int BOTTOM_FIELD_NUMBER = 4;
    private long bottom_;
    /**
     * <code>required sint64 bottom = 4;</code>
     * @return Whether the bottom field is set.
     */
    @java.lang.Override
    public boolean hasBottom() {
      return ((bitField0_ & 0x00000008) != 0);
    }
    /**
     * <code>required sint64 bottom = 4;</code>
     * @return The bottom.
     */
    @java.lang.Override
    public long getBottom() {
      return bottom_;
    }

    private byte memoizedIsInitialized = -1;
    @java.lang.Override
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized == 1) return true;
      if (isInitialized == 0) return false;

      if (!hasLeft()) {
        memoizedIsInitialized = 0;
        return false;
      }
      if (!hasRight()) {
        memoizedIsInitialized = 0;
        return false;
      }
      if (!hasTop()) {
        memoizedIsInitialized = 0;
        return false;
      }
      if (!hasBottom()) {
        memoizedIsInitialized = 0;
        return false;
      }
      memoizedIsInitialized = 1;
      return true;
    }

    @java.lang.Override
    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      if (((bitField0_ & 0x00000001) != 0)) {
        output.writeSInt64(1, left_);
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        output.writeSInt64(2, right_);
      }
      if (((bitField0_ & 0x00000004) != 0)) {
        output.writeSInt64(3, top_);
      }
      if (((bitField0_ & 0x00000008) != 0)) {
        output.writeSInt64(4, bottom_);
      }
      unknownFields.writeTo(output);
    }

    @java.lang.Override
    public int getSerializedSize() {
      int size = memoizedSize;
      if (size != -1) return size;

      size = 0;
      if (((bitField0_ & 0x00000001) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeSInt64Size(1, left_);
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeSInt64Size(2, right_);
      }
      if (((bitField0_ & 0x00000004) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeSInt64Size(3, top_);
      }
      if (((bitField0_ & 0x00000008) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeSInt64Size(4, bottom_);
      }
      size += unknownFields.getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @java.lang.Override
    public boolean equals(final java.lang.Object obj) {
      if (obj == this) {
       return true;
      }
      if (!(obj instanceof org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox)) {
        return super.equals(obj);
      }
      org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox other = (org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox) obj;

      if (hasLeft() != other.hasLeft()) return false;
      if (hasLeft()) {
        if (getLeft()
            != other.getLeft()) return false;
      }
      if (hasRight() != other.hasRight()) return false;
      if (hasRight()) {
        if (getRight()
            != other.getRight()) return false;
      }
      if (hasTop() != other.hasTop()) return false;
      if (hasTop()) {
        if (getTop()
            != other.getTop()) return false;
      }
      if (hasBottom() != other.hasBottom()) return false;
      if (hasBottom()) {
        if (getBottom()
            != other.getBottom()) return false;
      }
      if (!unknownFields.equals(other.unknownFields)) return false;
      return true;
    }

    @java.lang.Override
    public int hashCode() {
      if (memoizedHashCode != 0) {
        return memoizedHashCode;
      }
      int hash = 41;
      hash = (19 * hash) + getDescriptor().hashCode();
      if (hasLeft()) {
        hash = (37 * hash) + LEFT_FIELD_NUMBER;
        hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
            getLeft());
      }
      if (hasRight()) {
        hash = (37 * hash) + RIGHT_FIELD_NUMBER;
        hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
            getRight());
      }
      if (hasTop()) {
        hash = (37 * hash) + TOP_FIELD_NUMBER;
        hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
            getTop());
      }
      if (hasBottom()) {
        hash = (37 * hash) + BOTTOM_FIELD_NUMBER;
        hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
            getBottom());
      }
      hash = (29 * hash) + unknownFields.hashCode();
      memoizedHashCode = hash;
      return hash;
    }

    public static org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @java.lang.Override
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }
    public static Builder newBuilder(org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox prototype) {
      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
    }
    @java.lang.Override
    public Builder toBuilder() {
      return this == DEFAULT_INSTANCE
          ? new Builder() : new Builder().mergeFrom(this);
    }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code OSMPBF.HeaderBBox}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:OSMPBF.HeaderBBox)
        org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBoxOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_HeaderBBox_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_HeaderBBox_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox.class, org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox.Builder.class);
      }

      // Construct using org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        left_ = 0L;
        bitField0_ = (bitField0_ & ~0x00000001);
        right_ = 0L;
        bitField0_ = (bitField0_ & ~0x00000002);
        top_ = 0L;
        bitField0_ = (bitField0_ & ~0x00000004);
        bottom_ = 0L;
        bitField0_ = (bitField0_ & ~0x00000008);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_HeaderBBox_descriptor;
      }

      @java.lang.Override
      public org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox getDefaultInstanceForType() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox.getDefaultInstance();
      }

      @java.lang.Override
      public org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox build() {
        org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox buildPartial() {
        org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox result = new org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          result.left_ = left_;
          to_bitField0_ |= 0x00000001;
        }
        if (((from_bitField0_ & 0x00000002) != 0)) {
          result.right_ = right_;
          to_bitField0_ |= 0x00000002;
        }
        if (((from_bitField0_ & 0x00000004) != 0)) {
          result.top_ = top_;
          to_bitField0_ |= 0x00000004;
        }
        if (((from_bitField0_ & 0x00000008) != 0)) {
          result.bottom_ = bottom_;
          to_bitField0_ |= 0x00000008;
        }
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      @java.lang.Override
      public Builder clone() {
        return super.clone();
      }
      @java.lang.Override
      public Builder setField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.setField(field, value);
      }
      @java.lang.Override
      public Builder clearField(
          com.google.protobuf.Descriptors.FieldDescriptor field) {
        return super.clearField(field);
      }
      @java.lang.Override
      public Builder clearOneof(
          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
        return super.clearOneof(oneof);
      }
      @java.lang.Override
      public Builder setRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          int index, java.lang.Object value) {
        return super.setRepeatedField(field, index, value);
      }
      @java.lang.Override
      public Builder addRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.addRepeatedField(field, value);
      }
      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox) {
          return mergeFrom((org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox other) {
        if (other == org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox.getDefaultInstance()) return this;
        if (other.hasLeft()) {
          setLeft(other.getLeft());
        }
        if (other.hasRight()) {
          setRight(other.getRight());
        }
        if (other.hasTop()) {
          setTop(other.getTop());
        }
        if (other.hasBottom()) {
          setBottom(other.getBottom());
        }
        this.mergeUnknownFields(other.unknownFields);
        onChanged();
        return this;
      }

      @java.lang.Override
      public final boolean isInitialized() {
        if (!hasLeft()) {
          return false;
        }
        if (!hasRight()) {
          return false;
        }
        if (!hasTop()) {
          return false;
        }
        if (!hasBottom()) {
          return false;
        }
        return true;
      }

      @java.lang.Override
      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      private long left_ ;
      /**
       * <code>required sint64 left = 1;</code>
       * @return Whether the left field is set.
       */
      @java.lang.Override
      public boolean hasLeft() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <code>required sint64 left = 1;</code>
       * @return The left.
       */
      @java.lang.Override
      public long getLeft() {
        return left_;
      }
      /**
       * <code>required sint64 left = 1;</code>
       * @param value The left to set.
       * @return This builder for chaining.
       */
      public Builder setLeft(long value) {
        bitField0_ |= 0x00000001;
        left_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>required sint64 left = 1;</code>
       * @return This builder for chaining.
       */
      public Builder clearLeft() {
        bitField0_ = (bitField0_ & ~0x00000001);
        left_ = 0L;
        onChanged();
        return this;
      }

      private long right_ ;
      /**
       * <code>required sint64 right = 2;</code>
       * @return Whether the right field is set.
       */
      @java.lang.Override
      public boolean hasRight() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <code>required sint64 right = 2;</code>
       * @return The right.
       */
      @java.lang.Override
      public long getRight() {
        return right_;
      }
      /**
       * <code>required sint64 right = 2;</code>
       * @param value The right to set.
       * @return This builder for chaining.
       */
      public Builder setRight(long value) {
        bitField0_ |= 0x00000002;
        right_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>required sint64 right = 2;</code>
       * @return This builder for chaining.
       */
      public Builder clearRight() {
        bitField0_ = (bitField0_ & ~0x00000002);
        right_ = 0L;
        onChanged();
        return this;
      }

      private long top_ ;
      /**
       * <code>required sint64 top = 3;</code>
       * @return Whether the top field is set.
       */
      @java.lang.Override
      public boolean hasTop() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <code>required sint64 top = 3;</code>
       * @return The top.
       */
      @java.lang.Override
      public long getTop() {
        return top_;
      }
      /**
       * <code>required sint64 top = 3;</code>
       * @param value The top to set.
       * @return This builder for chaining.
       */
      public Builder setTop(long value) {
        bitField0_ |= 0x00000004;
        top_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>required sint64 top = 3;</code>
       * @return This builder for chaining.
       */
      public Builder clearTop() {
        bitField0_ = (bitField0_ & ~0x00000004);
        top_ = 0L;
        onChanged();
        return this;
      }

      private long bottom_ ;
      /**
       * <code>required sint64 bottom = 4;</code>
       * @return Whether the bottom field is set.
       */
      @java.lang.Override
      public boolean hasBottom() {
        return ((bitField0_ & 0x00000008) != 0);
      }
      /**
       * <code>required sint64 bottom = 4;</code>
       * @return The bottom.
       */
      @java.lang.Override
      public long getBottom() {
        return bottom_;
      }
      /**
       * <code>required sint64 bottom = 4;</code>
       * @param value The bottom to set.
       * @return This builder for chaining.
       */
      public Builder setBottom(long value) {
        bitField0_ |= 0x00000008;
        bottom_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>required sint64 bottom = 4;</code>
       * @return This builder for chaining.
       */
      public Builder clearBottom() {
        bitField0_ = (bitField0_ & ~0x00000008);
        bottom_ = 0L;
        onChanged();
        return this;
      }
      @java.lang.Override
      public final Builder setUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.setUnknownFields(unknownFields);
      }

      @java.lang.Override
      public final Builder mergeUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.mergeUnknownFields(unknownFields);
      }


      // @@protoc_insertion_point(builder_scope:OSMPBF.HeaderBBox)
    }

    // @@protoc_insertion_point(class_scope:OSMPBF.HeaderBBox)
    private static final org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox();
    }

    public static org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    @java.lang.Deprecated public static final com.google.protobuf.Parser<HeaderBBox>
        PARSER = new com.google.protobuf.AbstractParser<HeaderBBox>() {
      @java.lang.Override
      public HeaderBBox parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new HeaderBBox(input, extensionRegistry);
      }
    };

    public static com.google.protobuf.Parser<HeaderBBox> parser() {
      return PARSER;
    }

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

    @java.lang.Override
    public org.openstreetmap.osmosis.osmbinary.Osmformat.HeaderBBox getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface PrimitiveBlockOrBuilder extends
      // @@protoc_insertion_point(interface_extends:OSMPBF.PrimitiveBlock)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>required .OSMPBF.StringTable stringtable = 1;</code>
     * @return Whether the stringtable field is set.
     */
    boolean hasStringtable();
    /**
     * <code>required .OSMPBF.StringTable stringtable = 1;</code>
     * @return The stringtable.
     */
    org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable getStringtable();
    /**
     * <code>required .OSMPBF.StringTable stringtable = 1;</code>
     */
    org.openstreetmap.osmosis.osmbinary.Osmformat.StringTableOrBuilder getStringtableOrBuilder();

    /**
     * <code>repeated .OSMPBF.PrimitiveGroup primitivegroup = 2;</code>
     */
    java.util.List<org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup> 
        getPrimitivegroupList();
    /**
     * <code>repeated .OSMPBF.PrimitiveGroup primitivegroup = 2;</code>
     */
    org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup getPrimitivegroup(int index);
    /**
     * <code>repeated .OSMPBF.PrimitiveGroup primitivegroup = 2;</code>
     */
    int getPrimitivegroupCount();
    /**
     * <code>repeated .OSMPBF.PrimitiveGroup primitivegroup = 2;</code>
     */
    java.util.List<? extends org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroupOrBuilder> 
        getPrimitivegroupOrBuilderList();
    /**
     * <code>repeated .OSMPBF.PrimitiveGroup primitivegroup = 2;</code>
     */
    org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroupOrBuilder getPrimitivegroupOrBuilder(
        int index);

    /**
     * <pre>
     * Granularity, units of nanodegrees, used to store coordinates in this block
     * </pre>
     *
     * <code>optional int32 granularity = 17 [default = 100];</code>
     * @return Whether the granularity field is set.
     */
    boolean hasGranularity();
    /**
     * <pre>
     * Granularity, units of nanodegrees, used to store coordinates in this block
     * </pre>
     *
     * <code>optional int32 granularity = 17 [default = 100];</code>
     * @return The granularity.
     */
    int getGranularity();

    /**
     * <pre>
     * Offset value between the output coordinates coordinates and the granularity grid in unites of nanodegrees.
     * </pre>
     *
     * <code>optional int64 lat_offset = 19 [default = 0];</code>
     * @return Whether the latOffset field is set.
     */
    boolean hasLatOffset();
    /**
     * <pre>
     * Offset value between the output coordinates coordinates and the granularity grid in unites of nanodegrees.
     * </pre>
     *
     * <code>optional int64 lat_offset = 19 [default = 0];</code>
     * @return The latOffset.
     */
    long getLatOffset();

    /**
     * <code>optional int64 lon_offset = 20 [default = 0];</code>
     * @return Whether the lonOffset field is set.
     */
    boolean hasLonOffset();
    /**
     * <code>optional int64 lon_offset = 20 [default = 0];</code>
     * @return The lonOffset.
     */
    long getLonOffset();

    /**
     * <pre>
     * Granularity of dates, normally represented in units of milliseconds since the 1970 epoch.
     * </pre>
     *
     * <code>optional int32 date_granularity = 18 [default = 1000];</code>
     * @return Whether the dateGranularity field is set.
     */
    boolean hasDateGranularity();
    /**
     * <pre>
     * Granularity of dates, normally represented in units of milliseconds since the 1970 epoch.
     * </pre>
     *
     * <code>optional int32 date_granularity = 18 [default = 1000];</code>
     * @return The dateGranularity.
     */
    int getDateGranularity();
  }
  /**
   * Protobuf type {@code OSMPBF.PrimitiveBlock}
   */
  public static final class PrimitiveBlock extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:OSMPBF.PrimitiveBlock)
      PrimitiveBlockOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use PrimitiveBlock.newBuilder() to construct.
    private PrimitiveBlock(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private PrimitiveBlock() {
      primitivegroup_ = java.util.Collections.emptyList();
      granularity_ = 100;
      dateGranularity_ = 1000;
    }

    @java.lang.Override
    @SuppressWarnings({"unused"})
    protected java.lang.Object newInstance(
        UnusedPrivateParameter unused) {
      return new PrimitiveBlock();
    }

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    private PrimitiveBlock(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      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;
            case 10: {
              org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable.Builder subBuilder = null;
              if (((bitField0_ & 0x00000001) != 0)) {
                subBuilder = stringtable_.toBuilder();
              }
              stringtable_ = input.readMessage(org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(stringtable_);
                stringtable_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000001;
              break;
            }
            case 18: {
              if (!((mutable_bitField0_ & 0x00000002) != 0)) {
                primitivegroup_ = new java.util.ArrayList<org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup>();
                mutable_bitField0_ |= 0x00000002;
              }
              primitivegroup_.add(
                  input.readMessage(org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup.PARSER, extensionRegistry));
              break;
            }
            case 136: {
              bitField0_ |= 0x00000002;
              granularity_ = input.readInt32();
              break;
            }
            case 144: {
              bitField0_ |= 0x00000010;
              dateGranularity_ = input.readInt32();
              break;
            }
            case 152: {
              bitField0_ |= 0x00000004;
              latOffset_ = input.readInt64();
              break;
            }
            case 160: {
              bitField0_ |= 0x00000008;
              lonOffset_ = input.readInt64();
              break;
            }
            default: {
              if (!parseUnknownField(
                  input, unknownFields, extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e).setUnfinishedMessage(this);
      } finally {
        if (((mutable_bitField0_ & 0x00000002) != 0)) {
          primitivegroup_ = java.util.Collections.unmodifiableList(primitivegroup_);
        }
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_PrimitiveBlock_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_PrimitiveBlock_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveBlock.class, org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveBlock.Builder.class);
    }

    private int bitField0_;
    public static final int STRINGTABLE_FIELD_NUMBER = 1;
    private org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable stringtable_;
    /**
     * <code>required .OSMPBF.StringTable stringtable = 1;</code>
     * @return Whether the stringtable field is set.
     */
    @java.lang.Override
    public boolean hasStringtable() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <code>required .OSMPBF.StringTable stringtable = 1;</code>
     * @return The stringtable.
     */
    @java.lang.Override
    public org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable getStringtable() {
      return stringtable_ == null ? org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable.getDefaultInstance() : stringtable_;
    }
    /**
     * <code>required .OSMPBF.StringTable stringtable = 1;</code>
     */
    @java.lang.Override
    public org.openstreetmap.osmosis.osmbinary.Osmformat.StringTableOrBuilder getStringtableOrBuilder() {
      return stringtable_ == null ? org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable.getDefaultInstance() : stringtable_;
    }

    public static final int PRIMITIVEGROUP_FIELD_NUMBER = 2;
    private java.util.List<org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup> primitivegroup_;
    /**
     * <code>repeated .OSMPBF.PrimitiveGroup primitivegroup = 2;</code>
     */
    @java.lang.Override
    public java.util.List<org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup> getPrimitivegroupList() {
      return primitivegroup_;
    }
    /**
     * <code>repeated .OSMPBF.PrimitiveGroup primitivegroup = 2;</code>
     */
    @java.lang.Override
    public java.util.List<? extends org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroupOrBuilder> 
        getPrimitivegroupOrBuilderList() {
      return primitivegroup_;
    }
    /**
     * <code>repeated .OSMPBF.PrimitiveGroup primitivegroup = 2;</code>
     */
    @java.lang.Override
    public int getPrimitivegroupCount() {
      return primitivegroup_.size();
    }
    /**
     * <code>repeated .OSMPBF.PrimitiveGroup primitivegroup = 2;</code>
     */
    @java.lang.Override
    public org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup getPrimitivegroup(int index) {
      return primitivegroup_.get(index);
    }
    /**
     * <code>repeated .OSMPBF.PrimitiveGroup primitivegroup = 2;</code>
     */
    @java.lang.Override
    public org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroupOrBuilder getPrimitivegroupOrBuilder(
        int index) {
      return primitivegroup_.get(index);
    }

    public static final int GRANULARITY_FIELD_NUMBER = 17;
    private int granularity_;
    /**
     * <pre>
     * Granularity, units of nanodegrees, used to store coordinates in this block
     * </pre>
     *
     * <code>optional int32 granularity = 17 [default = 100];</code>
     * @return Whether the granularity field is set.
     */
    @java.lang.Override
    public boolean hasGranularity() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <pre>
     * Granularity, units of nanodegrees, used to store coordinates in this block
     * </pre>
     *
     * <code>optional int32 granularity = 17 [default = 100];</code>
     * @return The granularity.
     */
    @java.lang.Override
    public int getGranularity() {
      return granularity_;
    }

    public static final int LAT_OFFSET_FIELD_NUMBER = 19;
    private long latOffset_;
    /**
     * <pre>
     * Offset value between the output coordinates coordinates and the granularity grid in unites of nanodegrees.
     * </pre>
     *
     * <code>optional int64 lat_offset = 19 [default = 0];</code>
     * @return Whether the latOffset field is set.
     */
    @java.lang.Override
    public boolean hasLatOffset() {
      return ((bitField0_ & 0x00000004) != 0);
    }
    /**
     * <pre>
     * Offset value between the output coordinates coordinates and the granularity grid in unites of nanodegrees.
     * </pre>
     *
     * <code>optional int64 lat_offset = 19 [default = 0];</code>
     * @return The latOffset.
     */
    @java.lang.Override
    public long getLatOffset() {
      return latOffset_;
    }

    public static final int LON_OFFSET_FIELD_NUMBER = 20;
    private long lonOffset_;
    /**
     * <code>optional int64 lon_offset = 20 [default = 0];</code>
     * @return Whether the lonOffset field is set.
     */
    @java.lang.Override
    public boolean hasLonOffset() {
      return ((bitField0_ & 0x00000008) != 0);
    }
    /**
     * <code>optional int64 lon_offset = 20 [default = 0];</code>
     * @return The lonOffset.
     */
    @java.lang.Override
    public long getLonOffset() {
      return lonOffset_;
    }

    public static final int DATE_GRANULARITY_FIELD_NUMBER = 18;
    private int dateGranularity_;
    /**
     * <pre>
     * Granularity of dates, normally represented in units of milliseconds since the 1970 epoch.
     * </pre>
     *
     * <code>optional int32 date_granularity = 18 [default = 1000];</code>
     * @return Whether the dateGranularity field is set.
     */
    @java.lang.Override
    public boolean hasDateGranularity() {
      return ((bitField0_ & 0x00000010) != 0);
    }
    /**
     * <pre>
     * Granularity of dates, normally represented in units of milliseconds since the 1970 epoch.
     * </pre>
     *
     * <code>optional int32 date_granularity = 18 [default = 1000];</code>
     * @return The dateGranularity.
     */
    @java.lang.Override
    public int getDateGranularity() {
      return dateGranularity_;
    }

    private byte memoizedIsInitialized = -1;
    @java.lang.Override
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized == 1) return true;
      if (isInitialized == 0) return false;

      if (!hasStringtable()) {
        memoizedIsInitialized = 0;
        return false;
      }
      for (int i = 0; i < getPrimitivegroupCount(); i++) {
        if (!getPrimitivegroup(i).isInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
      }
      memoizedIsInitialized = 1;
      return true;
    }

    @java.lang.Override
    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      if (((bitField0_ & 0x00000001) != 0)) {
        output.writeMessage(1, getStringtable());
      }
      for (int i = 0; i < primitivegroup_.size(); i++) {
        output.writeMessage(2, primitivegroup_.get(i));
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        output.writeInt32(17, granularity_);
      }
      if (((bitField0_ & 0x00000010) != 0)) {
        output.writeInt32(18, dateGranularity_);
      }
      if (((bitField0_ & 0x00000004) != 0)) {
        output.writeInt64(19, latOffset_);
      }
      if (((bitField0_ & 0x00000008) != 0)) {
        output.writeInt64(20, lonOffset_);
      }
      unknownFields.writeTo(output);
    }

    @java.lang.Override
    public int getSerializedSize() {
      int size = memoizedSize;
      if (size != -1) return size;

      size = 0;
      if (((bitField0_ & 0x00000001) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(1, getStringtable());
      }
      for (int i = 0; i < primitivegroup_.size(); i++) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(2, primitivegroup_.get(i));
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt32Size(17, granularity_);
      }
      if (((bitField0_ & 0x00000010) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt32Size(18, dateGranularity_);
      }
      if (((bitField0_ & 0x00000004) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt64Size(19, latOffset_);
      }
      if (((bitField0_ & 0x00000008) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt64Size(20, lonOffset_);
      }
      size += unknownFields.getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @java.lang.Override
    public boolean equals(final java.lang.Object obj) {
      if (obj == this) {
       return true;
      }
      if (!(obj instanceof org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveBlock)) {
        return super.equals(obj);
      }
      org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveBlock other = (org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveBlock) obj;

      if (hasStringtable() != other.hasStringtable()) return false;
      if (hasStringtable()) {
        if (!getStringtable()
            .equals(other.getStringtable())) return false;
      }
      if (!getPrimitivegroupList()
          .equals(other.getPrimitivegroupList())) return false;
      if (hasGranularity() != other.hasGranularity()) return false;
      if (hasGranularity()) {
        if (getGranularity()
            != other.getGranularity()) return false;
      }
      if (hasLatOffset() != other.hasLatOffset()) return false;
      if (hasLatOffset()) {
        if (getLatOffset()
            != other.getLatOffset()) return false;
      }
      if (hasLonOffset() != other.hasLonOffset()) return false;
      if (hasLonOffset()) {
        if (getLonOffset()
            != other.getLonOffset()) return false;
      }
      if (hasDateGranularity() != other.hasDateGranularity()) return false;
      if (hasDateGranularity()) {
        if (getDateGranularity()
            != other.getDateGranularity()) return false;
      }
      if (!unknownFields.equals(other.unknownFields)) return false;
      return true;
    }

    @java.lang.Override
    public int hashCode() {
      if (memoizedHashCode != 0) {
        return memoizedHashCode;
      }
      int hash = 41;
      hash = (19 * hash) + getDescriptor().hashCode();
      if (hasStringtable()) {
        hash = (37 * hash) + STRINGTABLE_FIELD_NUMBER;
        hash = (53 * hash) + getStringtable().hashCode();
      }
      if (getPrimitivegroupCount() > 0) {
        hash = (37 * hash) + PRIMITIVEGROUP_FIELD_NUMBER;
        hash = (53 * hash) + getPrimitivegroupList().hashCode();
      }
      if (hasGranularity()) {
        hash = (37 * hash) + GRANULARITY_FIELD_NUMBER;
        hash = (53 * hash) + getGranularity();
      }
      if (hasLatOffset()) {
        hash = (37 * hash) + LAT_OFFSET_FIELD_NUMBER;
        hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
            getLatOffset());
      }
      if (hasLonOffset()) {
        hash = (37 * hash) + LON_OFFSET_FIELD_NUMBER;
        hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
            getLonOffset());
      }
      if (hasDateGranularity()) {
        hash = (37 * hash) + DATE_GRANULARITY_FIELD_NUMBER;
        hash = (53 * hash) + getDateGranularity();
      }
      hash = (29 * hash) + unknownFields.hashCode();
      memoizedHashCode = hash;
      return hash;
    }

    public static org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveBlock parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveBlock parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveBlock parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveBlock parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveBlock parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveBlock parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveBlock parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveBlock parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveBlock parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveBlock parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveBlock parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveBlock parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @java.lang.Override
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }
    public static Builder newBuilder(org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveBlock prototype) {
      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
    }
    @java.lang.Override
    public Builder toBuilder() {
      return this == DEFAULT_INSTANCE
          ? new Builder() : new Builder().mergeFrom(this);
    }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code OSMPBF.PrimitiveBlock}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:OSMPBF.PrimitiveBlock)
        org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveBlockOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_PrimitiveBlock_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_PrimitiveBlock_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveBlock.class, org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveBlock.Builder.class);
      }

      // Construct using org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveBlock.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
          getStringtableFieldBuilder();
          getPrimitivegroupFieldBuilder();
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        if (stringtableBuilder_ == null) {
          stringtable_ = null;
        } else {
          stringtableBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000001);
        if (primitivegroupBuilder_ == null) {
          primitivegroup_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000002);
        } else {
          primitivegroupBuilder_.clear();
        }
        granularity_ = 100;
        bitField0_ = (bitField0_ & ~0x00000004);
        latOffset_ = 0L;
        bitField0_ = (bitField0_ & ~0x00000008);
        lonOffset_ = 0L;
        bitField0_ = (bitField0_ & ~0x00000010);
        dateGranularity_ = 1000;
        bitField0_ = (bitField0_ & ~0x00000020);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_PrimitiveBlock_descriptor;
      }

      @java.lang.Override
      public org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveBlock getDefaultInstanceForType() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveBlock.getDefaultInstance();
      }

      @java.lang.Override
      public org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveBlock build() {
        org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveBlock result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveBlock buildPartial() {
        org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveBlock result = new org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveBlock(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          if (stringtableBuilder_ == null) {
            result.stringtable_ = stringtable_;
          } else {
            result.stringtable_ = stringtableBuilder_.build();
          }
          to_bitField0_ |= 0x00000001;
        }
        if (primitivegroupBuilder_ == null) {
          if (((bitField0_ & 0x00000002) != 0)) {
            primitivegroup_ = java.util.Collections.unmodifiableList(primitivegroup_);
            bitField0_ = (bitField0_ & ~0x00000002);
          }
          result.primitivegroup_ = primitivegroup_;
        } else {
          result.primitivegroup_ = primitivegroupBuilder_.build();
        }
        if (((from_bitField0_ & 0x00000004) != 0)) {
          to_bitField0_ |= 0x00000002;
        }
        result.granularity_ = granularity_;
        if (((from_bitField0_ & 0x00000008) != 0)) {
          result.latOffset_ = latOffset_;
          to_bitField0_ |= 0x00000004;
        }
        if (((from_bitField0_ & 0x00000010) != 0)) {
          result.lonOffset_ = lonOffset_;
          to_bitField0_ |= 0x00000008;
        }
        if (((from_bitField0_ & 0x00000020) != 0)) {
          to_bitField0_ |= 0x00000010;
        }
        result.dateGranularity_ = dateGranularity_;
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      @java.lang.Override
      public Builder clone() {
        return super.clone();
      }
      @java.lang.Override
      public Builder setField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.setField(field, value);
      }
      @java.lang.Override
      public Builder clearField(
          com.google.protobuf.Descriptors.FieldDescriptor field) {
        return super.clearField(field);
      }
      @java.lang.Override
      public Builder clearOneof(
          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
        return super.clearOneof(oneof);
      }
      @java.lang.Override
      public Builder setRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          int index, java.lang.Object value) {
        return super.setRepeatedField(field, index, value);
      }
      @java.lang.Override
      public Builder addRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.addRepeatedField(field, value);
      }
      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveBlock) {
          return mergeFrom((org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveBlock)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveBlock other) {
        if (other == org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveBlock.getDefaultInstance()) return this;
        if (other.hasStringtable()) {
          mergeStringtable(other.getStringtable());
        }
        if (primitivegroupBuilder_ == null) {
          if (!other.primitivegroup_.isEmpty()) {
            if (primitivegroup_.isEmpty()) {
              primitivegroup_ = other.primitivegroup_;
              bitField0_ = (bitField0_ & ~0x00000002);
            } else {
              ensurePrimitivegroupIsMutable();
              primitivegroup_.addAll(other.primitivegroup_);
            }
            onChanged();
          }
        } else {
          if (!other.primitivegroup_.isEmpty()) {
            if (primitivegroupBuilder_.isEmpty()) {
              primitivegroupBuilder_.dispose();
              primitivegroupBuilder_ = null;
              primitivegroup_ = other.primitivegroup_;
              bitField0_ = (bitField0_ & ~0x00000002);
              primitivegroupBuilder_ = 
                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
                   getPrimitivegroupFieldBuilder() : null;
            } else {
              primitivegroupBuilder_.addAllMessages(other.primitivegroup_);
            }
          }
        }
        if (other.hasGranularity()) {
          setGranularity(other.getGranularity());
        }
        if (other.hasLatOffset()) {
          setLatOffset(other.getLatOffset());
        }
        if (other.hasLonOffset()) {
          setLonOffset(other.getLonOffset());
        }
        if (other.hasDateGranularity()) {
          setDateGranularity(other.getDateGranularity());
        }
        this.mergeUnknownFields(other.unknownFields);
        onChanged();
        return this;
      }

      @java.lang.Override
      public final boolean isInitialized() {
        if (!hasStringtable()) {
          return false;
        }
        for (int i = 0; i < getPrimitivegroupCount(); i++) {
          if (!getPrimitivegroup(i).isInitialized()) {
            return false;
          }
        }
        return true;
      }

      @java.lang.Override
      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveBlock parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveBlock) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      private org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable stringtable_;
      private com.google.protobuf.SingleFieldBuilderV3<
          org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable, org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable.Builder, org.openstreetmap.osmosis.osmbinary.Osmformat.StringTableOrBuilder> stringtableBuilder_;
      /**
       * <code>required .OSMPBF.StringTable stringtable = 1;</code>
       * @return Whether the stringtable field is set.
       */
      public boolean hasStringtable() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <code>required .OSMPBF.StringTable stringtable = 1;</code>
       * @return The stringtable.
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable getStringtable() {
        if (stringtableBuilder_ == null) {
          return stringtable_ == null ? org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable.getDefaultInstance() : stringtable_;
        } else {
          return stringtableBuilder_.getMessage();
        }
      }
      /**
       * <code>required .OSMPBF.StringTable stringtable = 1;</code>
       */
      public Builder setStringtable(org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable value) {
        if (stringtableBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          stringtable_ = value;
          onChanged();
        } else {
          stringtableBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * <code>required .OSMPBF.StringTable stringtable = 1;</code>
       */
      public Builder setStringtable(
          org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable.Builder builderForValue) {
        if (stringtableBuilder_ == null) {
          stringtable_ = builderForValue.build();
          onChanged();
        } else {
          stringtableBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * <code>required .OSMPBF.StringTable stringtable = 1;</code>
       */
      public Builder mergeStringtable(org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable value) {
        if (stringtableBuilder_ == null) {
          if (((bitField0_ & 0x00000001) != 0) &&
              stringtable_ != null &&
              stringtable_ != org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable.getDefaultInstance()) {
            stringtable_ =
              org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable.newBuilder(stringtable_).mergeFrom(value).buildPartial();
          } else {
            stringtable_ = value;
          }
          onChanged();
        } else {
          stringtableBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000001;
        return this;
      }
      /**
       * <code>required .OSMPBF.StringTable stringtable = 1;</code>
       */
      public Builder clearStringtable() {
        if (stringtableBuilder_ == null) {
          stringtable_ = null;
          onChanged();
        } else {
          stringtableBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000001);
        return this;
      }
      /**
       * <code>required .OSMPBF.StringTable stringtable = 1;</code>
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable.Builder getStringtableBuilder() {
        bitField0_ |= 0x00000001;
        onChanged();
        return getStringtableFieldBuilder().getBuilder();
      }
      /**
       * <code>required .OSMPBF.StringTable stringtable = 1;</code>
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.StringTableOrBuilder getStringtableOrBuilder() {
        if (stringtableBuilder_ != null) {
          return stringtableBuilder_.getMessageOrBuilder();
        } else {
          return stringtable_ == null ?
              org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable.getDefaultInstance() : stringtable_;
        }
      }
      /**
       * <code>required .OSMPBF.StringTable stringtable = 1;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable, org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable.Builder, org.openstreetmap.osmosis.osmbinary.Osmformat.StringTableOrBuilder> 
          getStringtableFieldBuilder() {
        if (stringtableBuilder_ == null) {
          stringtableBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable, org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable.Builder, org.openstreetmap.osmosis.osmbinary.Osmformat.StringTableOrBuilder>(
                  getStringtable(),
                  getParentForChildren(),
                  isClean());
          stringtable_ = null;
        }
        return stringtableBuilder_;
      }

      private java.util.List<org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup> primitivegroup_ =
        java.util.Collections.emptyList();
      private void ensurePrimitivegroupIsMutable() {
        if (!((bitField0_ & 0x00000002) != 0)) {
          primitivegroup_ = new java.util.ArrayList<org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup>(primitivegroup_);
          bitField0_ |= 0x00000002;
         }
      }

      private com.google.protobuf.RepeatedFieldBuilderV3<
          org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup, org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup.Builder, org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroupOrBuilder> primitivegroupBuilder_;

      /**
       * <code>repeated .OSMPBF.PrimitiveGroup primitivegroup = 2;</code>
       */
      public java.util.List<org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup> getPrimitivegroupList() {
        if (primitivegroupBuilder_ == null) {
          return java.util.Collections.unmodifiableList(primitivegroup_);
        } else {
          return primitivegroupBuilder_.getMessageList();
        }
      }
      /**
       * <code>repeated .OSMPBF.PrimitiveGroup primitivegroup = 2;</code>
       */
      public int getPrimitivegroupCount() {
        if (primitivegroupBuilder_ == null) {
          return primitivegroup_.size();
        } else {
          return primitivegroupBuilder_.getCount();
        }
      }
      /**
       * <code>repeated .OSMPBF.PrimitiveGroup primitivegroup = 2;</code>
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup getPrimitivegroup(int index) {
        if (primitivegroupBuilder_ == null) {
          return primitivegroup_.get(index);
        } else {
          return primitivegroupBuilder_.getMessage(index);
        }
      }
      /**
       * <code>repeated .OSMPBF.PrimitiveGroup primitivegroup = 2;</code>
       */
      public Builder setPrimitivegroup(
          int index, org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup value) {
        if (primitivegroupBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensurePrimitivegroupIsMutable();
          primitivegroup_.set(index, value);
          onChanged();
        } else {
          primitivegroupBuilder_.setMessage(index, value);
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.PrimitiveGroup primitivegroup = 2;</code>
       */
      public Builder setPrimitivegroup(
          int index, org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup.Builder builderForValue) {
        if (primitivegroupBuilder_ == null) {
          ensurePrimitivegroupIsMutable();
          primitivegroup_.set(index, builderForValue.build());
          onChanged();
        } else {
          primitivegroupBuilder_.setMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.PrimitiveGroup primitivegroup = 2;</code>
       */
      public Builder addPrimitivegroup(org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup value) {
        if (primitivegroupBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensurePrimitivegroupIsMutable();
          primitivegroup_.add(value);
          onChanged();
        } else {
          primitivegroupBuilder_.addMessage(value);
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.PrimitiveGroup primitivegroup = 2;</code>
       */
      public Builder addPrimitivegroup(
          int index, org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup value) {
        if (primitivegroupBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensurePrimitivegroupIsMutable();
          primitivegroup_.add(index, value);
          onChanged();
        } else {
          primitivegroupBuilder_.addMessage(index, value);
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.PrimitiveGroup primitivegroup = 2;</code>
       */
      public Builder addPrimitivegroup(
          org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup.Builder builderForValue) {
        if (primitivegroupBuilder_ == null) {
          ensurePrimitivegroupIsMutable();
          primitivegroup_.add(builderForValue.build());
          onChanged();
        } else {
          primitivegroupBuilder_.addMessage(builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.PrimitiveGroup primitivegroup = 2;</code>
       */
      public Builder addPrimitivegroup(
          int index, org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup.Builder builderForValue) {
        if (primitivegroupBuilder_ == null) {
          ensurePrimitivegroupIsMutable();
          primitivegroup_.add(index, builderForValue.build());
          onChanged();
        } else {
          primitivegroupBuilder_.addMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.PrimitiveGroup primitivegroup = 2;</code>
       */
      public Builder addAllPrimitivegroup(
          java.lang.Iterable<? extends org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup> values) {
        if (primitivegroupBuilder_ == null) {
          ensurePrimitivegroupIsMutable();
          com.google.protobuf.AbstractMessageLite.Builder.addAll(
              values, primitivegroup_);
          onChanged();
        } else {
          primitivegroupBuilder_.addAllMessages(values);
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.PrimitiveGroup primitivegroup = 2;</code>
       */
      public Builder clearPrimitivegroup() {
        if (primitivegroupBuilder_ == null) {
          primitivegroup_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000002);
          onChanged();
        } else {
          primitivegroupBuilder_.clear();
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.PrimitiveGroup primitivegroup = 2;</code>
       */
      public Builder removePrimitivegroup(int index) {
        if (primitivegroupBuilder_ == null) {
          ensurePrimitivegroupIsMutable();
          primitivegroup_.remove(index);
          onChanged();
        } else {
          primitivegroupBuilder_.remove(index);
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.PrimitiveGroup primitivegroup = 2;</code>
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup.Builder getPrimitivegroupBuilder(
          int index) {
        return getPrimitivegroupFieldBuilder().getBuilder(index);
      }
      /**
       * <code>repeated .OSMPBF.PrimitiveGroup primitivegroup = 2;</code>
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroupOrBuilder getPrimitivegroupOrBuilder(
          int index) {
        if (primitivegroupBuilder_ == null) {
          return primitivegroup_.get(index);  } else {
          return primitivegroupBuilder_.getMessageOrBuilder(index);
        }
      }
      /**
       * <code>repeated .OSMPBF.PrimitiveGroup primitivegroup = 2;</code>
       */
      public java.util.List<? extends org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroupOrBuilder> 
           getPrimitivegroupOrBuilderList() {
        if (primitivegroupBuilder_ != null) {
          return primitivegroupBuilder_.getMessageOrBuilderList();
        } else {
          return java.util.Collections.unmodifiableList(primitivegroup_);
        }
      }
      /**
       * <code>repeated .OSMPBF.PrimitiveGroup primitivegroup = 2;</code>
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup.Builder addPrimitivegroupBuilder() {
        return getPrimitivegroupFieldBuilder().addBuilder(
            org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup.getDefaultInstance());
      }
      /**
       * <code>repeated .OSMPBF.PrimitiveGroup primitivegroup = 2;</code>
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup.Builder addPrimitivegroupBuilder(
          int index) {
        return getPrimitivegroupFieldBuilder().addBuilder(
            index, org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup.getDefaultInstance());
      }
      /**
       * <code>repeated .OSMPBF.PrimitiveGroup primitivegroup = 2;</code>
       */
      public java.util.List<org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup.Builder> 
           getPrimitivegroupBuilderList() {
        return getPrimitivegroupFieldBuilder().getBuilderList();
      }
      private com.google.protobuf.RepeatedFieldBuilderV3<
          org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup, org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup.Builder, org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroupOrBuilder> 
          getPrimitivegroupFieldBuilder() {
        if (primitivegroupBuilder_ == null) {
          primitivegroupBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
              org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup, org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup.Builder, org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroupOrBuilder>(
                  primitivegroup_,
                  ((bitField0_ & 0x00000002) != 0),
                  getParentForChildren(),
                  isClean());
          primitivegroup_ = null;
        }
        return primitivegroupBuilder_;
      }

      private int granularity_ = 100;
      /**
       * <pre>
       * Granularity, units of nanodegrees, used to store coordinates in this block
       * </pre>
       *
       * <code>optional int32 granularity = 17 [default = 100];</code>
       * @return Whether the granularity field is set.
       */
      @java.lang.Override
      public boolean hasGranularity() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <pre>
       * Granularity, units of nanodegrees, used to store coordinates in this block
       * </pre>
       *
       * <code>optional int32 granularity = 17 [default = 100];</code>
       * @return The granularity.
       */
      @java.lang.Override
      public int getGranularity() {
        return granularity_;
      }
      /**
       * <pre>
       * Granularity, units of nanodegrees, used to store coordinates in this block
       * </pre>
       *
       * <code>optional int32 granularity = 17 [default = 100];</code>
       * @param value The granularity to set.
       * @return This builder for chaining.
       */
      public Builder setGranularity(int value) {
        bitField0_ |= 0x00000004;
        granularity_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Granularity, units of nanodegrees, used to store coordinates in this block
       * </pre>
       *
       * <code>optional int32 granularity = 17 [default = 100];</code>
       * @return This builder for chaining.
       */
      public Builder clearGranularity() {
        bitField0_ = (bitField0_ & ~0x00000004);
        granularity_ = 100;
        onChanged();
        return this;
      }

      private long latOffset_ ;
      /**
       * <pre>
       * Offset value between the output coordinates coordinates and the granularity grid in unites of nanodegrees.
       * </pre>
       *
       * <code>optional int64 lat_offset = 19 [default = 0];</code>
       * @return Whether the latOffset field is set.
       */
      @java.lang.Override
      public boolean hasLatOffset() {
        return ((bitField0_ & 0x00000008) != 0);
      }
      /**
       * <pre>
       * Offset value between the output coordinates coordinates and the granularity grid in unites of nanodegrees.
       * </pre>
       *
       * <code>optional int64 lat_offset = 19 [default = 0];</code>
       * @return The latOffset.
       */
      @java.lang.Override
      public long getLatOffset() {
        return latOffset_;
      }
      /**
       * <pre>
       * Offset value between the output coordinates coordinates and the granularity grid in unites of nanodegrees.
       * </pre>
       *
       * <code>optional int64 lat_offset = 19 [default = 0];</code>
       * @param value The latOffset to set.
       * @return This builder for chaining.
       */
      public Builder setLatOffset(long value) {
        bitField0_ |= 0x00000008;
        latOffset_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Offset value between the output coordinates coordinates and the granularity grid in unites of nanodegrees.
       * </pre>
       *
       * <code>optional int64 lat_offset = 19 [default = 0];</code>
       * @return This builder for chaining.
       */
      public Builder clearLatOffset() {
        bitField0_ = (bitField0_ & ~0x00000008);
        latOffset_ = 0L;
        onChanged();
        return this;
      }

      private long lonOffset_ ;
      /**
       * <code>optional int64 lon_offset = 20 [default = 0];</code>
       * @return Whether the lonOffset field is set.
       */
      @java.lang.Override
      public boolean hasLonOffset() {
        return ((bitField0_ & 0x00000010) != 0);
      }
      /**
       * <code>optional int64 lon_offset = 20 [default = 0];</code>
       * @return The lonOffset.
       */
      @java.lang.Override
      public long getLonOffset() {
        return lonOffset_;
      }
      /**
       * <code>optional int64 lon_offset = 20 [default = 0];</code>
       * @param value The lonOffset to set.
       * @return This builder for chaining.
       */
      public Builder setLonOffset(long value) {
        bitField0_ |= 0x00000010;
        lonOffset_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional int64 lon_offset = 20 [default = 0];</code>
       * @return This builder for chaining.
       */
      public Builder clearLonOffset() {
        bitField0_ = (bitField0_ & ~0x00000010);
        lonOffset_ = 0L;
        onChanged();
        return this;
      }

      private int dateGranularity_ = 1000;
      /**
       * <pre>
       * Granularity of dates, normally represented in units of milliseconds since the 1970 epoch.
       * </pre>
       *
       * <code>optional int32 date_granularity = 18 [default = 1000];</code>
       * @return Whether the dateGranularity field is set.
       */
      @java.lang.Override
      public boolean hasDateGranularity() {
        return ((bitField0_ & 0x00000020) != 0);
      }
      /**
       * <pre>
       * Granularity of dates, normally represented in units of milliseconds since the 1970 epoch.
       * </pre>
       *
       * <code>optional int32 date_granularity = 18 [default = 1000];</code>
       * @return The dateGranularity.
       */
      @java.lang.Override
      public int getDateGranularity() {
        return dateGranularity_;
      }
      /**
       * <pre>
       * Granularity of dates, normally represented in units of milliseconds since the 1970 epoch.
       * </pre>
       *
       * <code>optional int32 date_granularity = 18 [default = 1000];</code>
       * @param value The dateGranularity to set.
       * @return This builder for chaining.
       */
      public Builder setDateGranularity(int value) {
        bitField0_ |= 0x00000020;
        dateGranularity_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Granularity of dates, normally represented in units of milliseconds since the 1970 epoch.
       * </pre>
       *
       * <code>optional int32 date_granularity = 18 [default = 1000];</code>
       * @return This builder for chaining.
       */
      public Builder clearDateGranularity() {
        bitField0_ = (bitField0_ & ~0x00000020);
        dateGranularity_ = 1000;
        onChanged();
        return this;
      }
      @java.lang.Override
      public final Builder setUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.setUnknownFields(unknownFields);
      }

      @java.lang.Override
      public final Builder mergeUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.mergeUnknownFields(unknownFields);
      }


      // @@protoc_insertion_point(builder_scope:OSMPBF.PrimitiveBlock)
    }

    // @@protoc_insertion_point(class_scope:OSMPBF.PrimitiveBlock)
    private static final org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveBlock DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveBlock();
    }

    public static org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveBlock getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    @java.lang.Deprecated public static final com.google.protobuf.Parser<PrimitiveBlock>
        PARSER = new com.google.protobuf.AbstractParser<PrimitiveBlock>() {
      @java.lang.Override
      public PrimitiveBlock parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new PrimitiveBlock(input, extensionRegistry);
      }
    };

    public static com.google.protobuf.Parser<PrimitiveBlock> parser() {
      return PARSER;
    }

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

    @java.lang.Override
    public org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveBlock getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface PrimitiveGroupOrBuilder extends
      // @@protoc_insertion_point(interface_extends:OSMPBF.PrimitiveGroup)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>repeated .OSMPBF.Node nodes = 1;</code>
     */
    java.util.List<org.openstreetmap.osmosis.osmbinary.Osmformat.Node> 
        getNodesList();
    /**
     * <code>repeated .OSMPBF.Node nodes = 1;</code>
     */
    org.openstreetmap.osmosis.osmbinary.Osmformat.Node getNodes(int index);
    /**
     * <code>repeated .OSMPBF.Node nodes = 1;</code>
     */
    int getNodesCount();
    /**
     * <code>repeated .OSMPBF.Node nodes = 1;</code>
     */
    java.util.List<? extends org.openstreetmap.osmosis.osmbinary.Osmformat.NodeOrBuilder> 
        getNodesOrBuilderList();
    /**
     * <code>repeated .OSMPBF.Node nodes = 1;</code>
     */
    org.openstreetmap.osmosis.osmbinary.Osmformat.NodeOrBuilder getNodesOrBuilder(
        int index);

    /**
     * <code>optional .OSMPBF.DenseNodes dense = 2;</code>
     * @return Whether the dense field is set.
     */
    boolean hasDense();
    /**
     * <code>optional .OSMPBF.DenseNodes dense = 2;</code>
     * @return The dense.
     */
    org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes getDense();
    /**
     * <code>optional .OSMPBF.DenseNodes dense = 2;</code>
     */
    org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodesOrBuilder getDenseOrBuilder();

    /**
     * <code>repeated .OSMPBF.Way ways = 3;</code>
     */
    java.util.List<org.openstreetmap.osmosis.osmbinary.Osmformat.Way> 
        getWaysList();
    /**
     * <code>repeated .OSMPBF.Way ways = 3;</code>
     */
    org.openstreetmap.osmosis.osmbinary.Osmformat.Way getWays(int index);
    /**
     * <code>repeated .OSMPBF.Way ways = 3;</code>
     */
    int getWaysCount();
    /**
     * <code>repeated .OSMPBF.Way ways = 3;</code>
     */
    java.util.List<? extends org.openstreetmap.osmosis.osmbinary.Osmformat.WayOrBuilder> 
        getWaysOrBuilderList();
    /**
     * <code>repeated .OSMPBF.Way ways = 3;</code>
     */
    org.openstreetmap.osmosis.osmbinary.Osmformat.WayOrBuilder getWaysOrBuilder(
        int index);

    /**
     * <code>repeated .OSMPBF.Relation relations = 4;</code>
     */
    java.util.List<org.openstreetmap.osmosis.osmbinary.Osmformat.Relation> 
        getRelationsList();
    /**
     * <code>repeated .OSMPBF.Relation relations = 4;</code>
     */
    org.openstreetmap.osmosis.osmbinary.Osmformat.Relation getRelations(int index);
    /**
     * <code>repeated .OSMPBF.Relation relations = 4;</code>
     */
    int getRelationsCount();
    /**
     * <code>repeated .OSMPBF.Relation relations = 4;</code>
     */
    java.util.List<? extends org.openstreetmap.osmosis.osmbinary.Osmformat.RelationOrBuilder> 
        getRelationsOrBuilderList();
    /**
     * <code>repeated .OSMPBF.Relation relations = 4;</code>
     */
    org.openstreetmap.osmosis.osmbinary.Osmformat.RelationOrBuilder getRelationsOrBuilder(
        int index);

    /**
     * <code>repeated .OSMPBF.ChangeSet changesets = 5;</code>
     */
    java.util.List<org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet> 
        getChangesetsList();
    /**
     * <code>repeated .OSMPBF.ChangeSet changesets = 5;</code>
     */
    org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet getChangesets(int index);
    /**
     * <code>repeated .OSMPBF.ChangeSet changesets = 5;</code>
     */
    int getChangesetsCount();
    /**
     * <code>repeated .OSMPBF.ChangeSet changesets = 5;</code>
     */
    java.util.List<? extends org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSetOrBuilder> 
        getChangesetsOrBuilderList();
    /**
     * <code>repeated .OSMPBF.ChangeSet changesets = 5;</code>
     */
    org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSetOrBuilder getChangesetsOrBuilder(
        int index);
  }
  /**
   * <pre>
   * Group of OSMPrimitives. All primitives in a group must be the same type.
   * </pre>
   *
   * Protobuf type {@code OSMPBF.PrimitiveGroup}
   */
  public static final class PrimitiveGroup extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:OSMPBF.PrimitiveGroup)
      PrimitiveGroupOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use PrimitiveGroup.newBuilder() to construct.
    private PrimitiveGroup(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private PrimitiveGroup() {
      nodes_ = java.util.Collections.emptyList();
      ways_ = java.util.Collections.emptyList();
      relations_ = java.util.Collections.emptyList();
      changesets_ = java.util.Collections.emptyList();
    }

    @java.lang.Override
    @SuppressWarnings({"unused"})
    protected java.lang.Object newInstance(
        UnusedPrivateParameter unused) {
      return new PrimitiveGroup();
    }

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    private PrimitiveGroup(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      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;
            case 10: {
              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
                nodes_ = new java.util.ArrayList<org.openstreetmap.osmosis.osmbinary.Osmformat.Node>();
                mutable_bitField0_ |= 0x00000001;
              }
              nodes_.add(
                  input.readMessage(org.openstreetmap.osmosis.osmbinary.Osmformat.Node.PARSER, extensionRegistry));
              break;
            }
            case 18: {
              org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes.Builder subBuilder = null;
              if (((bitField0_ & 0x00000001) != 0)) {
                subBuilder = dense_.toBuilder();
              }
              dense_ = input.readMessage(org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(dense_);
                dense_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000001;
              break;
            }
            case 26: {
              if (!((mutable_bitField0_ & 0x00000004) != 0)) {
                ways_ = new java.util.ArrayList<org.openstreetmap.osmosis.osmbinary.Osmformat.Way>();
                mutable_bitField0_ |= 0x00000004;
              }
              ways_.add(
                  input.readMessage(org.openstreetmap.osmosis.osmbinary.Osmformat.Way.PARSER, extensionRegistry));
              break;
            }
            case 34: {
              if (!((mutable_bitField0_ & 0x00000008) != 0)) {
                relations_ = new java.util.ArrayList<org.openstreetmap.osmosis.osmbinary.Osmformat.Relation>();
                mutable_bitField0_ |= 0x00000008;
              }
              relations_.add(
                  input.readMessage(org.openstreetmap.osmosis.osmbinary.Osmformat.Relation.PARSER, extensionRegistry));
              break;
            }
            case 42: {
              if (!((mutable_bitField0_ & 0x00000010) != 0)) {
                changesets_ = new java.util.ArrayList<org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet>();
                mutable_bitField0_ |= 0x00000010;
              }
              changesets_.add(
                  input.readMessage(org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet.PARSER, extensionRegistry));
              break;
            }
            default: {
              if (!parseUnknownField(
                  input, unknownFields, extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e).setUnfinishedMessage(this);
      } finally {
        if (((mutable_bitField0_ & 0x00000001) != 0)) {
          nodes_ = java.util.Collections.unmodifiableList(nodes_);
        }
        if (((mutable_bitField0_ & 0x00000004) != 0)) {
          ways_ = java.util.Collections.unmodifiableList(ways_);
        }
        if (((mutable_bitField0_ & 0x00000008) != 0)) {
          relations_ = java.util.Collections.unmodifiableList(relations_);
        }
        if (((mutable_bitField0_ & 0x00000010) != 0)) {
          changesets_ = java.util.Collections.unmodifiableList(changesets_);
        }
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_PrimitiveGroup_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_PrimitiveGroup_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup.class, org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup.Builder.class);
    }

    private int bitField0_;
    public static final int NODES_FIELD_NUMBER = 1;
    private java.util.List<org.openstreetmap.osmosis.osmbinary.Osmformat.Node> nodes_;
    /**
     * <code>repeated .OSMPBF.Node nodes = 1;</code>
     */
    @java.lang.Override
    public java.util.List<org.openstreetmap.osmosis.osmbinary.Osmformat.Node> getNodesList() {
      return nodes_;
    }
    /**
     * <code>repeated .OSMPBF.Node nodes = 1;</code>
     */
    @java.lang.Override
    public java.util.List<? extends org.openstreetmap.osmosis.osmbinary.Osmformat.NodeOrBuilder> 
        getNodesOrBuilderList() {
      return nodes_;
    }
    /**
     * <code>repeated .OSMPBF.Node nodes = 1;</code>
     */
    @java.lang.Override
    public int getNodesCount() {
      return nodes_.size();
    }
    /**
     * <code>repeated .OSMPBF.Node nodes = 1;</code>
     */
    @java.lang.Override
    public org.openstreetmap.osmosis.osmbinary.Osmformat.Node getNodes(int index) {
      return nodes_.get(index);
    }
    /**
     * <code>repeated .OSMPBF.Node nodes = 1;</code>
     */
    @java.lang.Override
    public org.openstreetmap.osmosis.osmbinary.Osmformat.NodeOrBuilder getNodesOrBuilder(
        int index) {
      return nodes_.get(index);
    }

    public static final int DENSE_FIELD_NUMBER = 2;
    private org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes dense_;
    /**
     * <code>optional .OSMPBF.DenseNodes dense = 2;</code>
     * @return Whether the dense field is set.
     */
    @java.lang.Override
    public boolean hasDense() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <code>optional .OSMPBF.DenseNodes dense = 2;</code>
     * @return The dense.
     */
    @java.lang.Override
    public org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes getDense() {
      return dense_ == null ? org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes.getDefaultInstance() : dense_;
    }
    /**
     * <code>optional .OSMPBF.DenseNodes dense = 2;</code>
     */
    @java.lang.Override
    public org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodesOrBuilder getDenseOrBuilder() {
      return dense_ == null ? org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes.getDefaultInstance() : dense_;
    }

    public static final int WAYS_FIELD_NUMBER = 3;
    private java.util.List<org.openstreetmap.osmosis.osmbinary.Osmformat.Way> ways_;
    /**
     * <code>repeated .OSMPBF.Way ways = 3;</code>
     */
    @java.lang.Override
    public java.util.List<org.openstreetmap.osmosis.osmbinary.Osmformat.Way> getWaysList() {
      return ways_;
    }
    /**
     * <code>repeated .OSMPBF.Way ways = 3;</code>
     */
    @java.lang.Override
    public java.util.List<? extends org.openstreetmap.osmosis.osmbinary.Osmformat.WayOrBuilder> 
        getWaysOrBuilderList() {
      return ways_;
    }
    /**
     * <code>repeated .OSMPBF.Way ways = 3;</code>
     */
    @java.lang.Override
    public int getWaysCount() {
      return ways_.size();
    }
    /**
     * <code>repeated .OSMPBF.Way ways = 3;</code>
     */
    @java.lang.Override
    public org.openstreetmap.osmosis.osmbinary.Osmformat.Way getWays(int index) {
      return ways_.get(index);
    }
    /**
     * <code>repeated .OSMPBF.Way ways = 3;</code>
     */
    @java.lang.Override
    public org.openstreetmap.osmosis.osmbinary.Osmformat.WayOrBuilder getWaysOrBuilder(
        int index) {
      return ways_.get(index);
    }

    public static final int RELATIONS_FIELD_NUMBER = 4;
    private java.util.List<org.openstreetmap.osmosis.osmbinary.Osmformat.Relation> relations_;
    /**
     * <code>repeated .OSMPBF.Relation relations = 4;</code>
     */
    @java.lang.Override
    public java.util.List<org.openstreetmap.osmosis.osmbinary.Osmformat.Relation> getRelationsList() {
      return relations_;
    }
    /**
     * <code>repeated .OSMPBF.Relation relations = 4;</code>
     */
    @java.lang.Override
    public java.util.List<? extends org.openstreetmap.osmosis.osmbinary.Osmformat.RelationOrBuilder> 
        getRelationsOrBuilderList() {
      return relations_;
    }
    /**
     * <code>repeated .OSMPBF.Relation relations = 4;</code>
     */
    @java.lang.Override
    public int getRelationsCount() {
      return relations_.size();
    }
    /**
     * <code>repeated .OSMPBF.Relation relations = 4;</code>
     */
    @java.lang.Override
    public org.openstreetmap.osmosis.osmbinary.Osmformat.Relation getRelations(int index) {
      return relations_.get(index);
    }
    /**
     * <code>repeated .OSMPBF.Relation relations = 4;</code>
     */
    @java.lang.Override
    public org.openstreetmap.osmosis.osmbinary.Osmformat.RelationOrBuilder getRelationsOrBuilder(
        int index) {
      return relations_.get(index);
    }

    public static final int CHANGESETS_FIELD_NUMBER = 5;
    private java.util.List<org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet> changesets_;
    /**
     * <code>repeated .OSMPBF.ChangeSet changesets = 5;</code>
     */
    @java.lang.Override
    public java.util.List<org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet> getChangesetsList() {
      return changesets_;
    }
    /**
     * <code>repeated .OSMPBF.ChangeSet changesets = 5;</code>
     */
    @java.lang.Override
    public java.util.List<? extends org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSetOrBuilder> 
        getChangesetsOrBuilderList() {
      return changesets_;
    }
    /**
     * <code>repeated .OSMPBF.ChangeSet changesets = 5;</code>
     */
    @java.lang.Override
    public int getChangesetsCount() {
      return changesets_.size();
    }
    /**
     * <code>repeated .OSMPBF.ChangeSet changesets = 5;</code>
     */
    @java.lang.Override
    public org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet getChangesets(int index) {
      return changesets_.get(index);
    }
    /**
     * <code>repeated .OSMPBF.ChangeSet changesets = 5;</code>
     */
    @java.lang.Override
    public org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSetOrBuilder getChangesetsOrBuilder(
        int index) {
      return changesets_.get(index);
    }

    private byte memoizedIsInitialized = -1;
    @java.lang.Override
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized == 1) return true;
      if (isInitialized == 0) return false;

      for (int i = 0; i < getNodesCount(); i++) {
        if (!getNodes(i).isInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
      }
      for (int i = 0; i < getWaysCount(); i++) {
        if (!getWays(i).isInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
      }
      for (int i = 0; i < getRelationsCount(); i++) {
        if (!getRelations(i).isInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
      }
      for (int i = 0; i < getChangesetsCount(); i++) {
        if (!getChangesets(i).isInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
      }
      memoizedIsInitialized = 1;
      return true;
    }

    @java.lang.Override
    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      for (int i = 0; i < nodes_.size(); i++) {
        output.writeMessage(1, nodes_.get(i));
      }
      if (((bitField0_ & 0x00000001) != 0)) {
        output.writeMessage(2, getDense());
      }
      for (int i = 0; i < ways_.size(); i++) {
        output.writeMessage(3, ways_.get(i));
      }
      for (int i = 0; i < relations_.size(); i++) {
        output.writeMessage(4, relations_.get(i));
      }
      for (int i = 0; i < changesets_.size(); i++) {
        output.writeMessage(5, changesets_.get(i));
      }
      unknownFields.writeTo(output);
    }

    @java.lang.Override
    public int getSerializedSize() {
      int size = memoizedSize;
      if (size != -1) return size;

      size = 0;
      for (int i = 0; i < nodes_.size(); i++) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(1, nodes_.get(i));
      }
      if (((bitField0_ & 0x00000001) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(2, getDense());
      }
      for (int i = 0; i < ways_.size(); i++) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(3, ways_.get(i));
      }
      for (int i = 0; i < relations_.size(); i++) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(4, relations_.get(i));
      }
      for (int i = 0; i < changesets_.size(); i++) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(5, changesets_.get(i));
      }
      size += unknownFields.getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @java.lang.Override
    public boolean equals(final java.lang.Object obj) {
      if (obj == this) {
       return true;
      }
      if (!(obj instanceof org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup)) {
        return super.equals(obj);
      }
      org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup other = (org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup) obj;

      if (!getNodesList()
          .equals(other.getNodesList())) return false;
      if (hasDense() != other.hasDense()) return false;
      if (hasDense()) {
        if (!getDense()
            .equals(other.getDense())) return false;
      }
      if (!getWaysList()
          .equals(other.getWaysList())) return false;
      if (!getRelationsList()
          .equals(other.getRelationsList())) return false;
      if (!getChangesetsList()
          .equals(other.getChangesetsList())) return false;
      if (!unknownFields.equals(other.unknownFields)) return false;
      return true;
    }

    @java.lang.Override
    public int hashCode() {
      if (memoizedHashCode != 0) {
        return memoizedHashCode;
      }
      int hash = 41;
      hash = (19 * hash) + getDescriptor().hashCode();
      if (getNodesCount() > 0) {
        hash = (37 * hash) + NODES_FIELD_NUMBER;
        hash = (53 * hash) + getNodesList().hashCode();
      }
      if (hasDense()) {
        hash = (37 * hash) + DENSE_FIELD_NUMBER;
        hash = (53 * hash) + getDense().hashCode();
      }
      if (getWaysCount() > 0) {
        hash = (37 * hash) + WAYS_FIELD_NUMBER;
        hash = (53 * hash) + getWaysList().hashCode();
      }
      if (getRelationsCount() > 0) {
        hash = (37 * hash) + RELATIONS_FIELD_NUMBER;
        hash = (53 * hash) + getRelationsList().hashCode();
      }
      if (getChangesetsCount() > 0) {
        hash = (37 * hash) + CHANGESETS_FIELD_NUMBER;
        hash = (53 * hash) + getChangesetsList().hashCode();
      }
      hash = (29 * hash) + unknownFields.hashCode();
      memoizedHashCode = hash;
      return hash;
    }

    public static org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @java.lang.Override
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }
    public static Builder newBuilder(org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup prototype) {
      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
    }
    @java.lang.Override
    public Builder toBuilder() {
      return this == DEFAULT_INSTANCE
          ? new Builder() : new Builder().mergeFrom(this);
    }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * <pre>
     * Group of OSMPrimitives. All primitives in a group must be the same type.
     * </pre>
     *
     * Protobuf type {@code OSMPBF.PrimitiveGroup}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:OSMPBF.PrimitiveGroup)
        org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroupOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_PrimitiveGroup_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_PrimitiveGroup_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup.class, org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup.Builder.class);
      }

      // Construct using org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
          getNodesFieldBuilder();
          getDenseFieldBuilder();
          getWaysFieldBuilder();
          getRelationsFieldBuilder();
          getChangesetsFieldBuilder();
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        if (nodesBuilder_ == null) {
          nodes_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000001);
        } else {
          nodesBuilder_.clear();
        }
        if (denseBuilder_ == null) {
          dense_ = null;
        } else {
          denseBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000002);
        if (waysBuilder_ == null) {
          ways_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000004);
        } else {
          waysBuilder_.clear();
        }
        if (relationsBuilder_ == null) {
          relations_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000008);
        } else {
          relationsBuilder_.clear();
        }
        if (changesetsBuilder_ == null) {
          changesets_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000010);
        } else {
          changesetsBuilder_.clear();
        }
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_PrimitiveGroup_descriptor;
      }

      @java.lang.Override
      public org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup getDefaultInstanceForType() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup.getDefaultInstance();
      }

      @java.lang.Override
      public org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup build() {
        org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup buildPartial() {
        org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup result = new org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (nodesBuilder_ == null) {
          if (((bitField0_ & 0x00000001) != 0)) {
            nodes_ = java.util.Collections.unmodifiableList(nodes_);
            bitField0_ = (bitField0_ & ~0x00000001);
          }
          result.nodes_ = nodes_;
        } else {
          result.nodes_ = nodesBuilder_.build();
        }
        if (((from_bitField0_ & 0x00000002) != 0)) {
          if (denseBuilder_ == null) {
            result.dense_ = dense_;
          } else {
            result.dense_ = denseBuilder_.build();
          }
          to_bitField0_ |= 0x00000001;
        }
        if (waysBuilder_ == null) {
          if (((bitField0_ & 0x00000004) != 0)) {
            ways_ = java.util.Collections.unmodifiableList(ways_);
            bitField0_ = (bitField0_ & ~0x00000004);
          }
          result.ways_ = ways_;
        } else {
          result.ways_ = waysBuilder_.build();
        }
        if (relationsBuilder_ == null) {
          if (((bitField0_ & 0x00000008) != 0)) {
            relations_ = java.util.Collections.unmodifiableList(relations_);
            bitField0_ = (bitField0_ & ~0x00000008);
          }
          result.relations_ = relations_;
        } else {
          result.relations_ = relationsBuilder_.build();
        }
        if (changesetsBuilder_ == null) {
          if (((bitField0_ & 0x00000010) != 0)) {
            changesets_ = java.util.Collections.unmodifiableList(changesets_);
            bitField0_ = (bitField0_ & ~0x00000010);
          }
          result.changesets_ = changesets_;
        } else {
          result.changesets_ = changesetsBuilder_.build();
        }
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      @java.lang.Override
      public Builder clone() {
        return super.clone();
      }
      @java.lang.Override
      public Builder setField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.setField(field, value);
      }
      @java.lang.Override
      public Builder clearField(
          com.google.protobuf.Descriptors.FieldDescriptor field) {
        return super.clearField(field);
      }
      @java.lang.Override
      public Builder clearOneof(
          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
        return super.clearOneof(oneof);
      }
      @java.lang.Override
      public Builder setRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          int index, java.lang.Object value) {
        return super.setRepeatedField(field, index, value);
      }
      @java.lang.Override
      public Builder addRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.addRepeatedField(field, value);
      }
      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup) {
          return mergeFrom((org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup other) {
        if (other == org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup.getDefaultInstance()) return this;
        if (nodesBuilder_ == null) {
          if (!other.nodes_.isEmpty()) {
            if (nodes_.isEmpty()) {
              nodes_ = other.nodes_;
              bitField0_ = (bitField0_ & ~0x00000001);
            } else {
              ensureNodesIsMutable();
              nodes_.addAll(other.nodes_);
            }
            onChanged();
          }
        } else {
          if (!other.nodes_.isEmpty()) {
            if (nodesBuilder_.isEmpty()) {
              nodesBuilder_.dispose();
              nodesBuilder_ = null;
              nodes_ = other.nodes_;
              bitField0_ = (bitField0_ & ~0x00000001);
              nodesBuilder_ = 
                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
                   getNodesFieldBuilder() : null;
            } else {
              nodesBuilder_.addAllMessages(other.nodes_);
            }
          }
        }
        if (other.hasDense()) {
          mergeDense(other.getDense());
        }
        if (waysBuilder_ == null) {
          if (!other.ways_.isEmpty()) {
            if (ways_.isEmpty()) {
              ways_ = other.ways_;
              bitField0_ = (bitField0_ & ~0x00000004);
            } else {
              ensureWaysIsMutable();
              ways_.addAll(other.ways_);
            }
            onChanged();
          }
        } else {
          if (!other.ways_.isEmpty()) {
            if (waysBuilder_.isEmpty()) {
              waysBuilder_.dispose();
              waysBuilder_ = null;
              ways_ = other.ways_;
              bitField0_ = (bitField0_ & ~0x00000004);
              waysBuilder_ = 
                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
                   getWaysFieldBuilder() : null;
            } else {
              waysBuilder_.addAllMessages(other.ways_);
            }
          }
        }
        if (relationsBuilder_ == null) {
          if (!other.relations_.isEmpty()) {
            if (relations_.isEmpty()) {
              relations_ = other.relations_;
              bitField0_ = (bitField0_ & ~0x00000008);
            } else {
              ensureRelationsIsMutable();
              relations_.addAll(other.relations_);
            }
            onChanged();
          }
        } else {
          if (!other.relations_.isEmpty()) {
            if (relationsBuilder_.isEmpty()) {
              relationsBuilder_.dispose();
              relationsBuilder_ = null;
              relations_ = other.relations_;
              bitField0_ = (bitField0_ & ~0x00000008);
              relationsBuilder_ = 
                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
                   getRelationsFieldBuilder() : null;
            } else {
              relationsBuilder_.addAllMessages(other.relations_);
            }
          }
        }
        if (changesetsBuilder_ == null) {
          if (!other.changesets_.isEmpty()) {
            if (changesets_.isEmpty()) {
              changesets_ = other.changesets_;
              bitField0_ = (bitField0_ & ~0x00000010);
            } else {
              ensureChangesetsIsMutable();
              changesets_.addAll(other.changesets_);
            }
            onChanged();
          }
        } else {
          if (!other.changesets_.isEmpty()) {
            if (changesetsBuilder_.isEmpty()) {
              changesetsBuilder_.dispose();
              changesetsBuilder_ = null;
              changesets_ = other.changesets_;
              bitField0_ = (bitField0_ & ~0x00000010);
              changesetsBuilder_ = 
                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
                   getChangesetsFieldBuilder() : null;
            } else {
              changesetsBuilder_.addAllMessages(other.changesets_);
            }
          }
        }
        this.mergeUnknownFields(other.unknownFields);
        onChanged();
        return this;
      }

      @java.lang.Override
      public final boolean isInitialized() {
        for (int i = 0; i < getNodesCount(); i++) {
          if (!getNodes(i).isInitialized()) {
            return false;
          }
        }
        for (int i = 0; i < getWaysCount(); i++) {
          if (!getWays(i).isInitialized()) {
            return false;
          }
        }
        for (int i = 0; i < getRelationsCount(); i++) {
          if (!getRelations(i).isInitialized()) {
            return false;
          }
        }
        for (int i = 0; i < getChangesetsCount(); i++) {
          if (!getChangesets(i).isInitialized()) {
            return false;
          }
        }
        return true;
      }

      @java.lang.Override
      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      private java.util.List<org.openstreetmap.osmosis.osmbinary.Osmformat.Node> nodes_ =
        java.util.Collections.emptyList();
      private void ensureNodesIsMutable() {
        if (!((bitField0_ & 0x00000001) != 0)) {
          nodes_ = new java.util.ArrayList<org.openstreetmap.osmosis.osmbinary.Osmformat.Node>(nodes_);
          bitField0_ |= 0x00000001;
         }
      }

      private com.google.protobuf.RepeatedFieldBuilderV3<
          org.openstreetmap.osmosis.osmbinary.Osmformat.Node, org.openstreetmap.osmosis.osmbinary.Osmformat.Node.Builder, org.openstreetmap.osmosis.osmbinary.Osmformat.NodeOrBuilder> nodesBuilder_;

      /**
       * <code>repeated .OSMPBF.Node nodes = 1;</code>
       */
      public java.util.List<org.openstreetmap.osmosis.osmbinary.Osmformat.Node> getNodesList() {
        if (nodesBuilder_ == null) {
          return java.util.Collections.unmodifiableList(nodes_);
        } else {
          return nodesBuilder_.getMessageList();
        }
      }
      /**
       * <code>repeated .OSMPBF.Node nodes = 1;</code>
       */
      public int getNodesCount() {
        if (nodesBuilder_ == null) {
          return nodes_.size();
        } else {
          return nodesBuilder_.getCount();
        }
      }
      /**
       * <code>repeated .OSMPBF.Node nodes = 1;</code>
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.Node getNodes(int index) {
        if (nodesBuilder_ == null) {
          return nodes_.get(index);
        } else {
          return nodesBuilder_.getMessage(index);
        }
      }
      /**
       * <code>repeated .OSMPBF.Node nodes = 1;</code>
       */
      public Builder setNodes(
          int index, org.openstreetmap.osmosis.osmbinary.Osmformat.Node value) {
        if (nodesBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureNodesIsMutable();
          nodes_.set(index, value);
          onChanged();
        } else {
          nodesBuilder_.setMessage(index, value);
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.Node nodes = 1;</code>
       */
      public Builder setNodes(
          int index, org.openstreetmap.osmosis.osmbinary.Osmformat.Node.Builder builderForValue) {
        if (nodesBuilder_ == null) {
          ensureNodesIsMutable();
          nodes_.set(index, builderForValue.build());
          onChanged();
        } else {
          nodesBuilder_.setMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.Node nodes = 1;</code>
       */
      public Builder addNodes(org.openstreetmap.osmosis.osmbinary.Osmformat.Node value) {
        if (nodesBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureNodesIsMutable();
          nodes_.add(value);
          onChanged();
        } else {
          nodesBuilder_.addMessage(value);
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.Node nodes = 1;</code>
       */
      public Builder addNodes(
          int index, org.openstreetmap.osmosis.osmbinary.Osmformat.Node value) {
        if (nodesBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureNodesIsMutable();
          nodes_.add(index, value);
          onChanged();
        } else {
          nodesBuilder_.addMessage(index, value);
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.Node nodes = 1;</code>
       */
      public Builder addNodes(
          org.openstreetmap.osmosis.osmbinary.Osmformat.Node.Builder builderForValue) {
        if (nodesBuilder_ == null) {
          ensureNodesIsMutable();
          nodes_.add(builderForValue.build());
          onChanged();
        } else {
          nodesBuilder_.addMessage(builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.Node nodes = 1;</code>
       */
      public Builder addNodes(
          int index, org.openstreetmap.osmosis.osmbinary.Osmformat.Node.Builder builderForValue) {
        if (nodesBuilder_ == null) {
          ensureNodesIsMutable();
          nodes_.add(index, builderForValue.build());
          onChanged();
        } else {
          nodesBuilder_.addMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.Node nodes = 1;</code>
       */
      public Builder addAllNodes(
          java.lang.Iterable<? extends org.openstreetmap.osmosis.osmbinary.Osmformat.Node> values) {
        if (nodesBuilder_ == null) {
          ensureNodesIsMutable();
          com.google.protobuf.AbstractMessageLite.Builder.addAll(
              values, nodes_);
          onChanged();
        } else {
          nodesBuilder_.addAllMessages(values);
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.Node nodes = 1;</code>
       */
      public Builder clearNodes() {
        if (nodesBuilder_ == null) {
          nodes_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000001);
          onChanged();
        } else {
          nodesBuilder_.clear();
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.Node nodes = 1;</code>
       */
      public Builder removeNodes(int index) {
        if (nodesBuilder_ == null) {
          ensureNodesIsMutable();
          nodes_.remove(index);
          onChanged();
        } else {
          nodesBuilder_.remove(index);
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.Node nodes = 1;</code>
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.Node.Builder getNodesBuilder(
          int index) {
        return getNodesFieldBuilder().getBuilder(index);
      }
      /**
       * <code>repeated .OSMPBF.Node nodes = 1;</code>
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.NodeOrBuilder getNodesOrBuilder(
          int index) {
        if (nodesBuilder_ == null) {
          return nodes_.get(index);  } else {
          return nodesBuilder_.getMessageOrBuilder(index);
        }
      }
      /**
       * <code>repeated .OSMPBF.Node nodes = 1;</code>
       */
      public java.util.List<? extends org.openstreetmap.osmosis.osmbinary.Osmformat.NodeOrBuilder> 
           getNodesOrBuilderList() {
        if (nodesBuilder_ != null) {
          return nodesBuilder_.getMessageOrBuilderList();
        } else {
          return java.util.Collections.unmodifiableList(nodes_);
        }
      }
      /**
       * <code>repeated .OSMPBF.Node nodes = 1;</code>
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.Node.Builder addNodesBuilder() {
        return getNodesFieldBuilder().addBuilder(
            org.openstreetmap.osmosis.osmbinary.Osmformat.Node.getDefaultInstance());
      }
      /**
       * <code>repeated .OSMPBF.Node nodes = 1;</code>
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.Node.Builder addNodesBuilder(
          int index) {
        return getNodesFieldBuilder().addBuilder(
            index, org.openstreetmap.osmosis.osmbinary.Osmformat.Node.getDefaultInstance());
      }
      /**
       * <code>repeated .OSMPBF.Node nodes = 1;</code>
       */
      public java.util.List<org.openstreetmap.osmosis.osmbinary.Osmformat.Node.Builder> 
           getNodesBuilderList() {
        return getNodesFieldBuilder().getBuilderList();
      }
      private com.google.protobuf.RepeatedFieldBuilderV3<
          org.openstreetmap.osmosis.osmbinary.Osmformat.Node, org.openstreetmap.osmosis.osmbinary.Osmformat.Node.Builder, org.openstreetmap.osmosis.osmbinary.Osmformat.NodeOrBuilder> 
          getNodesFieldBuilder() {
        if (nodesBuilder_ == null) {
          nodesBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
              org.openstreetmap.osmosis.osmbinary.Osmformat.Node, org.openstreetmap.osmosis.osmbinary.Osmformat.Node.Builder, org.openstreetmap.osmosis.osmbinary.Osmformat.NodeOrBuilder>(
                  nodes_,
                  ((bitField0_ & 0x00000001) != 0),
                  getParentForChildren(),
                  isClean());
          nodes_ = null;
        }
        return nodesBuilder_;
      }

      private org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes dense_;
      private com.google.protobuf.SingleFieldBuilderV3<
          org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes, org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes.Builder, org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodesOrBuilder> denseBuilder_;
      /**
       * <code>optional .OSMPBF.DenseNodes dense = 2;</code>
       * @return Whether the dense field is set.
       */
      public boolean hasDense() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <code>optional .OSMPBF.DenseNodes dense = 2;</code>
       * @return The dense.
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes getDense() {
        if (denseBuilder_ == null) {
          return dense_ == null ? org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes.getDefaultInstance() : dense_;
        } else {
          return denseBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .OSMPBF.DenseNodes dense = 2;</code>
       */
      public Builder setDense(org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes value) {
        if (denseBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          dense_ = value;
          onChanged();
        } else {
          denseBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000002;
        return this;
      }
      /**
       * <code>optional .OSMPBF.DenseNodes dense = 2;</code>
       */
      public Builder setDense(
          org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes.Builder builderForValue) {
        if (denseBuilder_ == null) {
          dense_ = builderForValue.build();
          onChanged();
        } else {
          denseBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000002;
        return this;
      }
      /**
       * <code>optional .OSMPBF.DenseNodes dense = 2;</code>
       */
      public Builder mergeDense(org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes value) {
        if (denseBuilder_ == null) {
          if (((bitField0_ & 0x00000002) != 0) &&
              dense_ != null &&
              dense_ != org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes.getDefaultInstance()) {
            dense_ =
              org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes.newBuilder(dense_).mergeFrom(value).buildPartial();
          } else {
            dense_ = value;
          }
          onChanged();
        } else {
          denseBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000002;
        return this;
      }
      /**
       * <code>optional .OSMPBF.DenseNodes dense = 2;</code>
       */
      public Builder clearDense() {
        if (denseBuilder_ == null) {
          dense_ = null;
          onChanged();
        } else {
          denseBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000002);
        return this;
      }
      /**
       * <code>optional .OSMPBF.DenseNodes dense = 2;</code>
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes.Builder getDenseBuilder() {
        bitField0_ |= 0x00000002;
        onChanged();
        return getDenseFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .OSMPBF.DenseNodes dense = 2;</code>
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodesOrBuilder getDenseOrBuilder() {
        if (denseBuilder_ != null) {
          return denseBuilder_.getMessageOrBuilder();
        } else {
          return dense_ == null ?
              org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes.getDefaultInstance() : dense_;
        }
      }
      /**
       * <code>optional .OSMPBF.DenseNodes dense = 2;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes, org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes.Builder, org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodesOrBuilder> 
          getDenseFieldBuilder() {
        if (denseBuilder_ == null) {
          denseBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes, org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes.Builder, org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodesOrBuilder>(
                  getDense(),
                  getParentForChildren(),
                  isClean());
          dense_ = null;
        }
        return denseBuilder_;
      }

      private java.util.List<org.openstreetmap.osmosis.osmbinary.Osmformat.Way> ways_ =
        java.util.Collections.emptyList();
      private void ensureWaysIsMutable() {
        if (!((bitField0_ & 0x00000004) != 0)) {
          ways_ = new java.util.ArrayList<org.openstreetmap.osmosis.osmbinary.Osmformat.Way>(ways_);
          bitField0_ |= 0x00000004;
         }
      }

      private com.google.protobuf.RepeatedFieldBuilderV3<
          org.openstreetmap.osmosis.osmbinary.Osmformat.Way, org.openstreetmap.osmosis.osmbinary.Osmformat.Way.Builder, org.openstreetmap.osmosis.osmbinary.Osmformat.WayOrBuilder> waysBuilder_;

      /**
       * <code>repeated .OSMPBF.Way ways = 3;</code>
       */
      public java.util.List<org.openstreetmap.osmosis.osmbinary.Osmformat.Way> getWaysList() {
        if (waysBuilder_ == null) {
          return java.util.Collections.unmodifiableList(ways_);
        } else {
          return waysBuilder_.getMessageList();
        }
      }
      /**
       * <code>repeated .OSMPBF.Way ways = 3;</code>
       */
      public int getWaysCount() {
        if (waysBuilder_ == null) {
          return ways_.size();
        } else {
          return waysBuilder_.getCount();
        }
      }
      /**
       * <code>repeated .OSMPBF.Way ways = 3;</code>
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.Way getWays(int index) {
        if (waysBuilder_ == null) {
          return ways_.get(index);
        } else {
          return waysBuilder_.getMessage(index);
        }
      }
      /**
       * <code>repeated .OSMPBF.Way ways = 3;</code>
       */
      public Builder setWays(
          int index, org.openstreetmap.osmosis.osmbinary.Osmformat.Way value) {
        if (waysBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureWaysIsMutable();
          ways_.set(index, value);
          onChanged();
        } else {
          waysBuilder_.setMessage(index, value);
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.Way ways = 3;</code>
       */
      public Builder setWays(
          int index, org.openstreetmap.osmosis.osmbinary.Osmformat.Way.Builder builderForValue) {
        if (waysBuilder_ == null) {
          ensureWaysIsMutable();
          ways_.set(index, builderForValue.build());
          onChanged();
        } else {
          waysBuilder_.setMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.Way ways = 3;</code>
       */
      public Builder addWays(org.openstreetmap.osmosis.osmbinary.Osmformat.Way value) {
        if (waysBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureWaysIsMutable();
          ways_.add(value);
          onChanged();
        } else {
          waysBuilder_.addMessage(value);
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.Way ways = 3;</code>
       */
      public Builder addWays(
          int index, org.openstreetmap.osmosis.osmbinary.Osmformat.Way value) {
        if (waysBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureWaysIsMutable();
          ways_.add(index, value);
          onChanged();
        } else {
          waysBuilder_.addMessage(index, value);
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.Way ways = 3;</code>
       */
      public Builder addWays(
          org.openstreetmap.osmosis.osmbinary.Osmformat.Way.Builder builderForValue) {
        if (waysBuilder_ == null) {
          ensureWaysIsMutable();
          ways_.add(builderForValue.build());
          onChanged();
        } else {
          waysBuilder_.addMessage(builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.Way ways = 3;</code>
       */
      public Builder addWays(
          int index, org.openstreetmap.osmosis.osmbinary.Osmformat.Way.Builder builderForValue) {
        if (waysBuilder_ == null) {
          ensureWaysIsMutable();
          ways_.add(index, builderForValue.build());
          onChanged();
        } else {
          waysBuilder_.addMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.Way ways = 3;</code>
       */
      public Builder addAllWays(
          java.lang.Iterable<? extends org.openstreetmap.osmosis.osmbinary.Osmformat.Way> values) {
        if (waysBuilder_ == null) {
          ensureWaysIsMutable();
          com.google.protobuf.AbstractMessageLite.Builder.addAll(
              values, ways_);
          onChanged();
        } else {
          waysBuilder_.addAllMessages(values);
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.Way ways = 3;</code>
       */
      public Builder clearWays() {
        if (waysBuilder_ == null) {
          ways_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000004);
          onChanged();
        } else {
          waysBuilder_.clear();
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.Way ways = 3;</code>
       */
      public Builder removeWays(int index) {
        if (waysBuilder_ == null) {
          ensureWaysIsMutable();
          ways_.remove(index);
          onChanged();
        } else {
          waysBuilder_.remove(index);
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.Way ways = 3;</code>
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.Way.Builder getWaysBuilder(
          int index) {
        return getWaysFieldBuilder().getBuilder(index);
      }
      /**
       * <code>repeated .OSMPBF.Way ways = 3;</code>
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.WayOrBuilder getWaysOrBuilder(
          int index) {
        if (waysBuilder_ == null) {
          return ways_.get(index);  } else {
          return waysBuilder_.getMessageOrBuilder(index);
        }
      }
      /**
       * <code>repeated .OSMPBF.Way ways = 3;</code>
       */
      public java.util.List<? extends org.openstreetmap.osmosis.osmbinary.Osmformat.WayOrBuilder> 
           getWaysOrBuilderList() {
        if (waysBuilder_ != null) {
          return waysBuilder_.getMessageOrBuilderList();
        } else {
          return java.util.Collections.unmodifiableList(ways_);
        }
      }
      /**
       * <code>repeated .OSMPBF.Way ways = 3;</code>
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.Way.Builder addWaysBuilder() {
        return getWaysFieldBuilder().addBuilder(
            org.openstreetmap.osmosis.osmbinary.Osmformat.Way.getDefaultInstance());
      }
      /**
       * <code>repeated .OSMPBF.Way ways = 3;</code>
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.Way.Builder addWaysBuilder(
          int index) {
        return getWaysFieldBuilder().addBuilder(
            index, org.openstreetmap.osmosis.osmbinary.Osmformat.Way.getDefaultInstance());
      }
      /**
       * <code>repeated .OSMPBF.Way ways = 3;</code>
       */
      public java.util.List<org.openstreetmap.osmosis.osmbinary.Osmformat.Way.Builder> 
           getWaysBuilderList() {
        return getWaysFieldBuilder().getBuilderList();
      }
      private com.google.protobuf.RepeatedFieldBuilderV3<
          org.openstreetmap.osmosis.osmbinary.Osmformat.Way, org.openstreetmap.osmosis.osmbinary.Osmformat.Way.Builder, org.openstreetmap.osmosis.osmbinary.Osmformat.WayOrBuilder> 
          getWaysFieldBuilder() {
        if (waysBuilder_ == null) {
          waysBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
              org.openstreetmap.osmosis.osmbinary.Osmformat.Way, org.openstreetmap.osmosis.osmbinary.Osmformat.Way.Builder, org.openstreetmap.osmosis.osmbinary.Osmformat.WayOrBuilder>(
                  ways_,
                  ((bitField0_ & 0x00000004) != 0),
                  getParentForChildren(),
                  isClean());
          ways_ = null;
        }
        return waysBuilder_;
      }

      private java.util.List<org.openstreetmap.osmosis.osmbinary.Osmformat.Relation> relations_ =
        java.util.Collections.emptyList();
      private void ensureRelationsIsMutable() {
        if (!((bitField0_ & 0x00000008) != 0)) {
          relations_ = new java.util.ArrayList<org.openstreetmap.osmosis.osmbinary.Osmformat.Relation>(relations_);
          bitField0_ |= 0x00000008;
         }
      }

      private com.google.protobuf.RepeatedFieldBuilderV3<
          org.openstreetmap.osmosis.osmbinary.Osmformat.Relation, org.openstreetmap.osmosis.osmbinary.Osmformat.Relation.Builder, org.openstreetmap.osmosis.osmbinary.Osmformat.RelationOrBuilder> relationsBuilder_;

      /**
       * <code>repeated .OSMPBF.Relation relations = 4;</code>
       */
      public java.util.List<org.openstreetmap.osmosis.osmbinary.Osmformat.Relation> getRelationsList() {
        if (relationsBuilder_ == null) {
          return java.util.Collections.unmodifiableList(relations_);
        } else {
          return relationsBuilder_.getMessageList();
        }
      }
      /**
       * <code>repeated .OSMPBF.Relation relations = 4;</code>
       */
      public int getRelationsCount() {
        if (relationsBuilder_ == null) {
          return relations_.size();
        } else {
          return relationsBuilder_.getCount();
        }
      }
      /**
       * <code>repeated .OSMPBF.Relation relations = 4;</code>
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.Relation getRelations(int index) {
        if (relationsBuilder_ == null) {
          return relations_.get(index);
        } else {
          return relationsBuilder_.getMessage(index);
        }
      }
      /**
       * <code>repeated .OSMPBF.Relation relations = 4;</code>
       */
      public Builder setRelations(
          int index, org.openstreetmap.osmosis.osmbinary.Osmformat.Relation value) {
        if (relationsBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureRelationsIsMutable();
          relations_.set(index, value);
          onChanged();
        } else {
          relationsBuilder_.setMessage(index, value);
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.Relation relations = 4;</code>
       */
      public Builder setRelations(
          int index, org.openstreetmap.osmosis.osmbinary.Osmformat.Relation.Builder builderForValue) {
        if (relationsBuilder_ == null) {
          ensureRelationsIsMutable();
          relations_.set(index, builderForValue.build());
          onChanged();
        } else {
          relationsBuilder_.setMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.Relation relations = 4;</code>
       */
      public Builder addRelations(org.openstreetmap.osmosis.osmbinary.Osmformat.Relation value) {
        if (relationsBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureRelationsIsMutable();
          relations_.add(value);
          onChanged();
        } else {
          relationsBuilder_.addMessage(value);
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.Relation relations = 4;</code>
       */
      public Builder addRelations(
          int index, org.openstreetmap.osmosis.osmbinary.Osmformat.Relation value) {
        if (relationsBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureRelationsIsMutable();
          relations_.add(index, value);
          onChanged();
        } else {
          relationsBuilder_.addMessage(index, value);
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.Relation relations = 4;</code>
       */
      public Builder addRelations(
          org.openstreetmap.osmosis.osmbinary.Osmformat.Relation.Builder builderForValue) {
        if (relationsBuilder_ == null) {
          ensureRelationsIsMutable();
          relations_.add(builderForValue.build());
          onChanged();
        } else {
          relationsBuilder_.addMessage(builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.Relation relations = 4;</code>
       */
      public Builder addRelations(
          int index, org.openstreetmap.osmosis.osmbinary.Osmformat.Relation.Builder builderForValue) {
        if (relationsBuilder_ == null) {
          ensureRelationsIsMutable();
          relations_.add(index, builderForValue.build());
          onChanged();
        } else {
          relationsBuilder_.addMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.Relation relations = 4;</code>
       */
      public Builder addAllRelations(
          java.lang.Iterable<? extends org.openstreetmap.osmosis.osmbinary.Osmformat.Relation> values) {
        if (relationsBuilder_ == null) {
          ensureRelationsIsMutable();
          com.google.protobuf.AbstractMessageLite.Builder.addAll(
              values, relations_);
          onChanged();
        } else {
          relationsBuilder_.addAllMessages(values);
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.Relation relations = 4;</code>
       */
      public Builder clearRelations() {
        if (relationsBuilder_ == null) {
          relations_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000008);
          onChanged();
        } else {
          relationsBuilder_.clear();
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.Relation relations = 4;</code>
       */
      public Builder removeRelations(int index) {
        if (relationsBuilder_ == null) {
          ensureRelationsIsMutable();
          relations_.remove(index);
          onChanged();
        } else {
          relationsBuilder_.remove(index);
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.Relation relations = 4;</code>
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.Relation.Builder getRelationsBuilder(
          int index) {
        return getRelationsFieldBuilder().getBuilder(index);
      }
      /**
       * <code>repeated .OSMPBF.Relation relations = 4;</code>
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.RelationOrBuilder getRelationsOrBuilder(
          int index) {
        if (relationsBuilder_ == null) {
          return relations_.get(index);  } else {
          return relationsBuilder_.getMessageOrBuilder(index);
        }
      }
      /**
       * <code>repeated .OSMPBF.Relation relations = 4;</code>
       */
      public java.util.List<? extends org.openstreetmap.osmosis.osmbinary.Osmformat.RelationOrBuilder> 
           getRelationsOrBuilderList() {
        if (relationsBuilder_ != null) {
          return relationsBuilder_.getMessageOrBuilderList();
        } else {
          return java.util.Collections.unmodifiableList(relations_);
        }
      }
      /**
       * <code>repeated .OSMPBF.Relation relations = 4;</code>
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.Relation.Builder addRelationsBuilder() {
        return getRelationsFieldBuilder().addBuilder(
            org.openstreetmap.osmosis.osmbinary.Osmformat.Relation.getDefaultInstance());
      }
      /**
       * <code>repeated .OSMPBF.Relation relations = 4;</code>
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.Relation.Builder addRelationsBuilder(
          int index) {
        return getRelationsFieldBuilder().addBuilder(
            index, org.openstreetmap.osmosis.osmbinary.Osmformat.Relation.getDefaultInstance());
      }
      /**
       * <code>repeated .OSMPBF.Relation relations = 4;</code>
       */
      public java.util.List<org.openstreetmap.osmosis.osmbinary.Osmformat.Relation.Builder> 
           getRelationsBuilderList() {
        return getRelationsFieldBuilder().getBuilderList();
      }
      private com.google.protobuf.RepeatedFieldBuilderV3<
          org.openstreetmap.osmosis.osmbinary.Osmformat.Relation, org.openstreetmap.osmosis.osmbinary.Osmformat.Relation.Builder, org.openstreetmap.osmosis.osmbinary.Osmformat.RelationOrBuilder> 
          getRelationsFieldBuilder() {
        if (relationsBuilder_ == null) {
          relationsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
              org.openstreetmap.osmosis.osmbinary.Osmformat.Relation, org.openstreetmap.osmosis.osmbinary.Osmformat.Relation.Builder, org.openstreetmap.osmosis.osmbinary.Osmformat.RelationOrBuilder>(
                  relations_,
                  ((bitField0_ & 0x00000008) != 0),
                  getParentForChildren(),
                  isClean());
          relations_ = null;
        }
        return relationsBuilder_;
      }

      private java.util.List<org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet> changesets_ =
        java.util.Collections.emptyList();
      private void ensureChangesetsIsMutable() {
        if (!((bitField0_ & 0x00000010) != 0)) {
          changesets_ = new java.util.ArrayList<org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet>(changesets_);
          bitField0_ |= 0x00000010;
         }
      }

      private com.google.protobuf.RepeatedFieldBuilderV3<
          org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet, org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet.Builder, org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSetOrBuilder> changesetsBuilder_;

      /**
       * <code>repeated .OSMPBF.ChangeSet changesets = 5;</code>
       */
      public java.util.List<org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet> getChangesetsList() {
        if (changesetsBuilder_ == null) {
          return java.util.Collections.unmodifiableList(changesets_);
        } else {
          return changesetsBuilder_.getMessageList();
        }
      }
      /**
       * <code>repeated .OSMPBF.ChangeSet changesets = 5;</code>
       */
      public int getChangesetsCount() {
        if (changesetsBuilder_ == null) {
          return changesets_.size();
        } else {
          return changesetsBuilder_.getCount();
        }
      }
      /**
       * <code>repeated .OSMPBF.ChangeSet changesets = 5;</code>
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet getChangesets(int index) {
        if (changesetsBuilder_ == null) {
          return changesets_.get(index);
        } else {
          return changesetsBuilder_.getMessage(index);
        }
      }
      /**
       * <code>repeated .OSMPBF.ChangeSet changesets = 5;</code>
       */
      public Builder setChangesets(
          int index, org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet value) {
        if (changesetsBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureChangesetsIsMutable();
          changesets_.set(index, value);
          onChanged();
        } else {
          changesetsBuilder_.setMessage(index, value);
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.ChangeSet changesets = 5;</code>
       */
      public Builder setChangesets(
          int index, org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet.Builder builderForValue) {
        if (changesetsBuilder_ == null) {
          ensureChangesetsIsMutable();
          changesets_.set(index, builderForValue.build());
          onChanged();
        } else {
          changesetsBuilder_.setMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.ChangeSet changesets = 5;</code>
       */
      public Builder addChangesets(org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet value) {
        if (changesetsBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureChangesetsIsMutable();
          changesets_.add(value);
          onChanged();
        } else {
          changesetsBuilder_.addMessage(value);
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.ChangeSet changesets = 5;</code>
       */
      public Builder addChangesets(
          int index, org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet value) {
        if (changesetsBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureChangesetsIsMutable();
          changesets_.add(index, value);
          onChanged();
        } else {
          changesetsBuilder_.addMessage(index, value);
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.ChangeSet changesets = 5;</code>
       */
      public Builder addChangesets(
          org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet.Builder builderForValue) {
        if (changesetsBuilder_ == null) {
          ensureChangesetsIsMutable();
          changesets_.add(builderForValue.build());
          onChanged();
        } else {
          changesetsBuilder_.addMessage(builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.ChangeSet changesets = 5;</code>
       */
      public Builder addChangesets(
          int index, org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet.Builder builderForValue) {
        if (changesetsBuilder_ == null) {
          ensureChangesetsIsMutable();
          changesets_.add(index, builderForValue.build());
          onChanged();
        } else {
          changesetsBuilder_.addMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.ChangeSet changesets = 5;</code>
       */
      public Builder addAllChangesets(
          java.lang.Iterable<? extends org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet> values) {
        if (changesetsBuilder_ == null) {
          ensureChangesetsIsMutable();
          com.google.protobuf.AbstractMessageLite.Builder.addAll(
              values, changesets_);
          onChanged();
        } else {
          changesetsBuilder_.addAllMessages(values);
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.ChangeSet changesets = 5;</code>
       */
      public Builder clearChangesets() {
        if (changesetsBuilder_ == null) {
          changesets_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000010);
          onChanged();
        } else {
          changesetsBuilder_.clear();
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.ChangeSet changesets = 5;</code>
       */
      public Builder removeChangesets(int index) {
        if (changesetsBuilder_ == null) {
          ensureChangesetsIsMutable();
          changesets_.remove(index);
          onChanged();
        } else {
          changesetsBuilder_.remove(index);
        }
        return this;
      }
      /**
       * <code>repeated .OSMPBF.ChangeSet changesets = 5;</code>
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet.Builder getChangesetsBuilder(
          int index) {
        return getChangesetsFieldBuilder().getBuilder(index);
      }
      /**
       * <code>repeated .OSMPBF.ChangeSet changesets = 5;</code>
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSetOrBuilder getChangesetsOrBuilder(
          int index) {
        if (changesetsBuilder_ == null) {
          return changesets_.get(index);  } else {
          return changesetsBuilder_.getMessageOrBuilder(index);
        }
      }
      /**
       * <code>repeated .OSMPBF.ChangeSet changesets = 5;</code>
       */
      public java.util.List<? extends org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSetOrBuilder> 
           getChangesetsOrBuilderList() {
        if (changesetsBuilder_ != null) {
          return changesetsBuilder_.getMessageOrBuilderList();
        } else {
          return java.util.Collections.unmodifiableList(changesets_);
        }
      }
      /**
       * <code>repeated .OSMPBF.ChangeSet changesets = 5;</code>
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet.Builder addChangesetsBuilder() {
        return getChangesetsFieldBuilder().addBuilder(
            org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet.getDefaultInstance());
      }
      /**
       * <code>repeated .OSMPBF.ChangeSet changesets = 5;</code>
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet.Builder addChangesetsBuilder(
          int index) {
        return getChangesetsFieldBuilder().addBuilder(
            index, org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet.getDefaultInstance());
      }
      /**
       * <code>repeated .OSMPBF.ChangeSet changesets = 5;</code>
       */
      public java.util.List<org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet.Builder> 
           getChangesetsBuilderList() {
        return getChangesetsFieldBuilder().getBuilderList();
      }
      private com.google.protobuf.RepeatedFieldBuilderV3<
          org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet, org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet.Builder, org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSetOrBuilder> 
          getChangesetsFieldBuilder() {
        if (changesetsBuilder_ == null) {
          changesetsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
              org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet, org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet.Builder, org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSetOrBuilder>(
                  changesets_,
                  ((bitField0_ & 0x00000010) != 0),
                  getParentForChildren(),
                  isClean());
          changesets_ = null;
        }
        return changesetsBuilder_;
      }
      @java.lang.Override
      public final Builder setUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.setUnknownFields(unknownFields);
      }

      @java.lang.Override
      public final Builder mergeUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.mergeUnknownFields(unknownFields);
      }


      // @@protoc_insertion_point(builder_scope:OSMPBF.PrimitiveGroup)
    }

    // @@protoc_insertion_point(class_scope:OSMPBF.PrimitiveGroup)
    private static final org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup();
    }

    public static org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    @java.lang.Deprecated public static final com.google.protobuf.Parser<PrimitiveGroup>
        PARSER = new com.google.protobuf.AbstractParser<PrimitiveGroup>() {
      @java.lang.Override
      public PrimitiveGroup parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new PrimitiveGroup(input, extensionRegistry);
      }
    };

    public static com.google.protobuf.Parser<PrimitiveGroup> parser() {
      return PARSER;
    }

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

    @java.lang.Override
    public org.openstreetmap.osmosis.osmbinary.Osmformat.PrimitiveGroup getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface StringTableOrBuilder extends
      // @@protoc_insertion_point(interface_extends:OSMPBF.StringTable)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>repeated bytes s = 1;</code>
     * @return A list containing the s.
     */
    java.util.List<com.google.protobuf.ByteString> getSList();
    /**
     * <code>repeated bytes s = 1;</code>
     * @return The count of s.
     */
    int getSCount();
    /**
     * <code>repeated bytes s = 1;</code>
     * @param index The index of the element to return.
     * @return The s at the given index.
     */
    com.google.protobuf.ByteString getS(int index);
  }
  /**
   * <pre>
   ** String table, contains the common strings in each block.
   *Note that we reserve index '0' as a delimiter, so the entry at that
   *index in the table is ALWAYS blank and unused.
   * </pre>
   *
   * Protobuf type {@code OSMPBF.StringTable}
   */
  public static final class StringTable extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:OSMPBF.StringTable)
      StringTableOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use StringTable.newBuilder() to construct.
    private StringTable(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private StringTable() {
      s_ = java.util.Collections.emptyList();
    }

    @java.lang.Override
    @SuppressWarnings({"unused"})
    protected java.lang.Object newInstance(
        UnusedPrivateParameter unused) {
      return new StringTable();
    }

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    private StringTable(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      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;
            case 10: {
              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
                s_ = new java.util.ArrayList<com.google.protobuf.ByteString>();
                mutable_bitField0_ |= 0x00000001;
              }
              s_.add(input.readBytes());
              break;
            }
            default: {
              if (!parseUnknownField(
                  input, unknownFields, extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e).setUnfinishedMessage(this);
      } finally {
        if (((mutable_bitField0_ & 0x00000001) != 0)) {
          s_ = java.util.Collections.unmodifiableList(s_); // C
        }
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_StringTable_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_StringTable_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable.class, org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable.Builder.class);
    }

    public static final int S_FIELD_NUMBER = 1;
    private java.util.List<com.google.protobuf.ByteString> s_;
    /**
     * <code>repeated bytes s = 1;</code>
     * @return A list containing the s.
     */
    @java.lang.Override
    public java.util.List<com.google.protobuf.ByteString>
        getSList() {
      return s_;
    }
    /**
     * <code>repeated bytes s = 1;</code>
     * @return The count of s.
     */
    public int getSCount() {
      return s_.size();
    }
    /**
     * <code>repeated bytes s = 1;</code>
     * @param index The index of the element to return.
     * @return The s at the given index.
     */
    public com.google.protobuf.ByteString getS(int index) {
      return s_.get(index);
    }

    private byte memoizedIsInitialized = -1;
    @java.lang.Override
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized == 1) return true;
      if (isInitialized == 0) return false;

      memoizedIsInitialized = 1;
      return true;
    }

    @java.lang.Override
    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      for (int i = 0; i < s_.size(); i++) {
        output.writeBytes(1, s_.get(i));
      }
      unknownFields.writeTo(output);
    }

    @java.lang.Override
    public int getSerializedSize() {
      int size = memoizedSize;
      if (size != -1) return size;

      size = 0;
      {
        int dataSize = 0;
        for (int i = 0; i < s_.size(); i++) {
          dataSize += com.google.protobuf.CodedOutputStream
            .computeBytesSizeNoTag(s_.get(i));
        }
        size += dataSize;
        size += 1 * getSList().size();
      }
      size += unknownFields.getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @java.lang.Override
    public boolean equals(final java.lang.Object obj) {
      if (obj == this) {
       return true;
      }
      if (!(obj instanceof org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable)) {
        return super.equals(obj);
      }
      org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable other = (org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable) obj;

      if (!getSList()
          .equals(other.getSList())) return false;
      if (!unknownFields.equals(other.unknownFields)) return false;
      return true;
    }

    @java.lang.Override
    public int hashCode() {
      if (memoizedHashCode != 0) {
        return memoizedHashCode;
      }
      int hash = 41;
      hash = (19 * hash) + getDescriptor().hashCode();
      if (getSCount() > 0) {
        hash = (37 * hash) + S_FIELD_NUMBER;
        hash = (53 * hash) + getSList().hashCode();
      }
      hash = (29 * hash) + unknownFields.hashCode();
      memoizedHashCode = hash;
      return hash;
    }

    public static org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @java.lang.Override
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }
    public static Builder newBuilder(org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable prototype) {
      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
    }
    @java.lang.Override
    public Builder toBuilder() {
      return this == DEFAULT_INSTANCE
          ? new Builder() : new Builder().mergeFrom(this);
    }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * <pre>
     ** String table, contains the common strings in each block.
     *Note that we reserve index '0' as a delimiter, so the entry at that
     *index in the table is ALWAYS blank and unused.
     * </pre>
     *
     * Protobuf type {@code OSMPBF.StringTable}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:OSMPBF.StringTable)
        org.openstreetmap.osmosis.osmbinary.Osmformat.StringTableOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_StringTable_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_StringTable_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable.class, org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable.Builder.class);
      }

      // Construct using org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        s_ = java.util.Collections.emptyList();
        bitField0_ = (bitField0_ & ~0x00000001);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_StringTable_descriptor;
      }

      @java.lang.Override
      public org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable getDefaultInstanceForType() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable.getDefaultInstance();
      }

      @java.lang.Override
      public org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable build() {
        org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable buildPartial() {
        org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable result = new org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable(this);
        int from_bitField0_ = bitField0_;
        if (((bitField0_ & 0x00000001) != 0)) {
          s_ = java.util.Collections.unmodifiableList(s_);
          bitField0_ = (bitField0_ & ~0x00000001);
        }
        result.s_ = s_;
        onBuilt();
        return result;
      }

      @java.lang.Override
      public Builder clone() {
        return super.clone();
      }
      @java.lang.Override
      public Builder setField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.setField(field, value);
      }
      @java.lang.Override
      public Builder clearField(
          com.google.protobuf.Descriptors.FieldDescriptor field) {
        return super.clearField(field);
      }
      @java.lang.Override
      public Builder clearOneof(
          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
        return super.clearOneof(oneof);
      }
      @java.lang.Override
      public Builder setRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          int index, java.lang.Object value) {
        return super.setRepeatedField(field, index, value);
      }
      @java.lang.Override
      public Builder addRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.addRepeatedField(field, value);
      }
      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable) {
          return mergeFrom((org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable other) {
        if (other == org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable.getDefaultInstance()) return this;
        if (!other.s_.isEmpty()) {
          if (s_.isEmpty()) {
            s_ = other.s_;
            bitField0_ = (bitField0_ & ~0x00000001);
          } else {
            ensureSIsMutable();
            s_.addAll(other.s_);
          }
          onChanged();
        }
        this.mergeUnknownFields(other.unknownFields);
        onChanged();
        return this;
      }

      @java.lang.Override
      public final boolean isInitialized() {
        return true;
      }

      @java.lang.Override
      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      private java.util.List<com.google.protobuf.ByteString> s_ = java.util.Collections.emptyList();
      private void ensureSIsMutable() {
        if (!((bitField0_ & 0x00000001) != 0)) {
          s_ = new java.util.ArrayList<com.google.protobuf.ByteString>(s_);
          bitField0_ |= 0x00000001;
         }
      }
      /**
       * <code>repeated bytes s = 1;</code>
       * @return A list containing the s.
       */
      public java.util.List<com.google.protobuf.ByteString>
          getSList() {
        return ((bitField0_ & 0x00000001) != 0) ?
                 java.util.Collections.unmodifiableList(s_) : s_;
      }
      /**
       * <code>repeated bytes s = 1;</code>
       * @return The count of s.
       */
      public int getSCount() {
        return s_.size();
      }
      /**
       * <code>repeated bytes s = 1;</code>
       * @param index The index of the element to return.
       * @return The s at the given index.
       */
      public com.google.protobuf.ByteString getS(int index) {
        return s_.get(index);
      }
      /**
       * <code>repeated bytes s = 1;</code>
       * @param index The index to set the value at.
       * @param value The s to set.
       * @return This builder for chaining.
       */
      public Builder setS(
          int index, com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureSIsMutable();
        s_.set(index, value);
        onChanged();
        return this;
      }
      /**
       * <code>repeated bytes s = 1;</code>
       * @param value The s to add.
       * @return This builder for chaining.
       */
      public Builder addS(com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureSIsMutable();
        s_.add(value);
        onChanged();
        return this;
      }
      /**
       * <code>repeated bytes s = 1;</code>
       * @param values The s to add.
       * @return This builder for chaining.
       */
      public Builder addAllS(
          java.lang.Iterable<? extends com.google.protobuf.ByteString> values) {
        ensureSIsMutable();
        com.google.protobuf.AbstractMessageLite.Builder.addAll(
            values, s_);
        onChanged();
        return this;
      }
      /**
       * <code>repeated bytes s = 1;</code>
       * @return This builder for chaining.
       */
      public Builder clearS() {
        s_ = java.util.Collections.emptyList();
        bitField0_ = (bitField0_ & ~0x00000001);
        onChanged();
        return this;
      }
      @java.lang.Override
      public final Builder setUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.setUnknownFields(unknownFields);
      }

      @java.lang.Override
      public final Builder mergeUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.mergeUnknownFields(unknownFields);
      }


      // @@protoc_insertion_point(builder_scope:OSMPBF.StringTable)
    }

    // @@protoc_insertion_point(class_scope:OSMPBF.StringTable)
    private static final org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable();
    }

    public static org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    @java.lang.Deprecated public static final com.google.protobuf.Parser<StringTable>
        PARSER = new com.google.protobuf.AbstractParser<StringTable>() {
      @java.lang.Override
      public StringTable parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new StringTable(input, extensionRegistry);
      }
    };

    public static com.google.protobuf.Parser<StringTable> parser() {
      return PARSER;
    }

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

    @java.lang.Override
    public org.openstreetmap.osmosis.osmbinary.Osmformat.StringTable getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface InfoOrBuilder extends
      // @@protoc_insertion_point(interface_extends:OSMPBF.Info)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>optional int32 version = 1 [default = -1];</code>
     * @return Whether the version field is set.
     */
    boolean hasVersion();
    /**
     * <code>optional int32 version = 1 [default = -1];</code>
     * @return The version.
     */
    int getVersion();

    /**
     * <code>optional int64 timestamp = 2;</code>
     * @return Whether the timestamp field is set.
     */
    boolean hasTimestamp();
    /**
     * <code>optional int64 timestamp = 2;</code>
     * @return The timestamp.
     */
    long getTimestamp();

    /**
     * <code>optional int64 changeset = 3;</code>
     * @return Whether the changeset field is set.
     */
    boolean hasChangeset();
    /**
     * <code>optional int64 changeset = 3;</code>
     * @return The changeset.
     */
    long getChangeset();

    /**
     * <code>optional int32 uid = 4;</code>
     * @return Whether the uid field is set.
     */
    boolean hasUid();
    /**
     * <code>optional int32 uid = 4;</code>
     * @return The uid.
     */
    int getUid();

    /**
     * <pre>
     * String IDs
     * </pre>
     *
     * <code>optional uint32 user_sid = 5;</code>
     * @return Whether the userSid field is set.
     */
    boolean hasUserSid();
    /**
     * <pre>
     * String IDs
     * </pre>
     *
     * <code>optional uint32 user_sid = 5;</code>
     * @return The userSid.
     */
    int getUserSid();

    /**
     * <pre>
     * The visible flag is used to store history information. It indicates that
     * the current object version has been created by a delete operation on the
     * OSM API.
     * When a writer sets this flag, it MUST add a required_features tag with
     * value "HistoricalInformation" to the HeaderBlock.
     * If this flag is not available for some object it MUST be assumed to be
     * true if the file has the required_features tag "HistoricalInformation"
     * set.
     * </pre>
     *
     * <code>optional bool visible = 6;</code>
     * @return Whether the visible field is set.
     */
    boolean hasVisible();
    /**
     * <pre>
     * The visible flag is used to store history information. It indicates that
     * the current object version has been created by a delete operation on the
     * OSM API.
     * When a writer sets this flag, it MUST add a required_features tag with
     * value "HistoricalInformation" to the HeaderBlock.
     * If this flag is not available for some object it MUST be assumed to be
     * true if the file has the required_features tag "HistoricalInformation"
     * set.
     * </pre>
     *
     * <code>optional bool visible = 6;</code>
     * @return The visible.
     */
    boolean getVisible();
  }
  /**
   * <pre>
   * Optional metadata that may be included into each primitive. 
   * </pre>
   *
   * Protobuf type {@code OSMPBF.Info}
   */
  public static final class Info extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:OSMPBF.Info)
      InfoOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use Info.newBuilder() to construct.
    private Info(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private Info() {
      version_ = -1;
    }

    @java.lang.Override
    @SuppressWarnings({"unused"})
    protected java.lang.Object newInstance(
        UnusedPrivateParameter unused) {
      return new Info();
    }

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    private Info(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      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;
            case 8: {
              bitField0_ |= 0x00000001;
              version_ = input.readInt32();
              break;
            }
            case 16: {
              bitField0_ |= 0x00000002;
              timestamp_ = input.readInt64();
              break;
            }
            case 24: {
              bitField0_ |= 0x00000004;
              changeset_ = input.readInt64();
              break;
            }
            case 32: {
              bitField0_ |= 0x00000008;
              uid_ = input.readInt32();
              break;
            }
            case 40: {
              bitField0_ |= 0x00000010;
              userSid_ = input.readUInt32();
              break;
            }
            case 48: {
              bitField0_ |= 0x00000020;
              visible_ = input.readBool();
              break;
            }
            default: {
              if (!parseUnknownField(
                  input, unknownFields, extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_Info_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_Info_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              org.openstreetmap.osmosis.osmbinary.Osmformat.Info.class, org.openstreetmap.osmosis.osmbinary.Osmformat.Info.Builder.class);
    }

    private int bitField0_;
    public static final int VERSION_FIELD_NUMBER = 1;
    private int version_;
    /**
     * <code>optional int32 version = 1 [default = -1];</code>
     * @return Whether the version field is set.
     */
    @java.lang.Override
    public boolean hasVersion() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <code>optional int32 version = 1 [default = -1];</code>
     * @return The version.
     */
    @java.lang.Override
    public int getVersion() {
      return version_;
    }

    public static final int TIMESTAMP_FIELD_NUMBER = 2;
    private long timestamp_;
    /**
     * <code>optional int64 timestamp = 2;</code>
     * @return Whether the timestamp field is set.
     */
    @java.lang.Override
    public boolean hasTimestamp() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <code>optional int64 timestamp = 2;</code>
     * @return The timestamp.
     */
    @java.lang.Override
    public long getTimestamp() {
      return timestamp_;
    }

    public static final int CHANGESET_FIELD_NUMBER = 3;
    private long changeset_;
    /**
     * <code>optional int64 changeset = 3;</code>
     * @return Whether the changeset field is set.
     */
    @java.lang.Override
    public boolean hasChangeset() {
      return ((bitField0_ & 0x00000004) != 0);
    }
    /**
     * <code>optional int64 changeset = 3;</code>
     * @return The changeset.
     */
    @java.lang.Override
    public long getChangeset() {
      return changeset_;
    }

    public static final int UID_FIELD_NUMBER = 4;
    private int uid_;
    /**
     * <code>optional int32 uid = 4;</code>
     * @return Whether the uid field is set.
     */
    @java.lang.Override
    public boolean hasUid() {
      return ((bitField0_ & 0x00000008) != 0);
    }
    /**
     * <code>optional int32 uid = 4;</code>
     * @return The uid.
     */
    @java.lang.Override
    public int getUid() {
      return uid_;
    }

    public static final int USER_SID_FIELD_NUMBER = 5;
    private int userSid_;
    /**
     * <pre>
     * String IDs
     * </pre>
     *
     * <code>optional uint32 user_sid = 5;</code>
     * @return Whether the userSid field is set.
     */
    @java.lang.Override
    public boolean hasUserSid() {
      return ((bitField0_ & 0x00000010) != 0);
    }
    /**
     * <pre>
     * String IDs
     * </pre>
     *
     * <code>optional uint32 user_sid = 5;</code>
     * @return The userSid.
     */
    @java.lang.Override
    public int getUserSid() {
      return userSid_;
    }

    public static final int VISIBLE_FIELD_NUMBER = 6;
    private boolean visible_;
    /**
     * <pre>
     * The visible flag is used to store history information. It indicates that
     * the current object version has been created by a delete operation on the
     * OSM API.
     * When a writer sets this flag, it MUST add a required_features tag with
     * value "HistoricalInformation" to the HeaderBlock.
     * If this flag is not available for some object it MUST be assumed to be
     * true if the file has the required_features tag "HistoricalInformation"
     * set.
     * </pre>
     *
     * <code>optional bool visible = 6;</code>
     * @return Whether the visible field is set.
     */
    @java.lang.Override
    public boolean hasVisible() {
      return ((bitField0_ & 0x00000020) != 0);
    }
    /**
     * <pre>
     * The visible flag is used to store history information. It indicates that
     * the current object version has been created by a delete operation on the
     * OSM API.
     * When a writer sets this flag, it MUST add a required_features tag with
     * value "HistoricalInformation" to the HeaderBlock.
     * If this flag is not available for some object it MUST be assumed to be
     * true if the file has the required_features tag "HistoricalInformation"
     * set.
     * </pre>
     *
     * <code>optional bool visible = 6;</code>
     * @return The visible.
     */
    @java.lang.Override
    public boolean getVisible() {
      return visible_;
    }

    private byte memoizedIsInitialized = -1;
    @java.lang.Override
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized == 1) return true;
      if (isInitialized == 0) return false;

      memoizedIsInitialized = 1;
      return true;
    }

    @java.lang.Override
    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      if (((bitField0_ & 0x00000001) != 0)) {
        output.writeInt32(1, version_);
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        output.writeInt64(2, timestamp_);
      }
      if (((bitField0_ & 0x00000004) != 0)) {
        output.writeInt64(3, changeset_);
      }
      if (((bitField0_ & 0x00000008) != 0)) {
        output.writeInt32(4, uid_);
      }
      if (((bitField0_ & 0x00000010) != 0)) {
        output.writeUInt32(5, userSid_);
      }
      if (((bitField0_ & 0x00000020) != 0)) {
        output.writeBool(6, visible_);
      }
      unknownFields.writeTo(output);
    }

    @java.lang.Override
    public int getSerializedSize() {
      int size = memoizedSize;
      if (size != -1) return size;

      size = 0;
      if (((bitField0_ & 0x00000001) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt32Size(1, version_);
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt64Size(2, timestamp_);
      }
      if (((bitField0_ & 0x00000004) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt64Size(3, changeset_);
      }
      if (((bitField0_ & 0x00000008) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt32Size(4, uid_);
      }
      if (((bitField0_ & 0x00000010) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeUInt32Size(5, userSid_);
      }
      if (((bitField0_ & 0x00000020) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBoolSize(6, visible_);
      }
      size += unknownFields.getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @java.lang.Override
    public boolean equals(final java.lang.Object obj) {
      if (obj == this) {
       return true;
      }
      if (!(obj instanceof org.openstreetmap.osmosis.osmbinary.Osmformat.Info)) {
        return super.equals(obj);
      }
      org.openstreetmap.osmosis.osmbinary.Osmformat.Info other = (org.openstreetmap.osmosis.osmbinary.Osmformat.Info) obj;

      if (hasVersion() != other.hasVersion()) return false;
      if (hasVersion()) {
        if (getVersion()
            != other.getVersion()) return false;
      }
      if (hasTimestamp() != other.hasTimestamp()) return false;
      if (hasTimestamp()) {
        if (getTimestamp()
            != other.getTimestamp()) return false;
      }
      if (hasChangeset() != other.hasChangeset()) return false;
      if (hasChangeset()) {
        if (getChangeset()
            != other.getChangeset()) return false;
      }
      if (hasUid() != other.hasUid()) return false;
      if (hasUid()) {
        if (getUid()
            != other.getUid()) return false;
      }
      if (hasUserSid() != other.hasUserSid()) return false;
      if (hasUserSid()) {
        if (getUserSid()
            != other.getUserSid()) return false;
      }
      if (hasVisible() != other.hasVisible()) return false;
      if (hasVisible()) {
        if (getVisible()
            != other.getVisible()) return false;
      }
      if (!unknownFields.equals(other.unknownFields)) return false;
      return true;
    }

    @java.lang.Override
    public int hashCode() {
      if (memoizedHashCode != 0) {
        return memoizedHashCode;
      }
      int hash = 41;
      hash = (19 * hash) + getDescriptor().hashCode();
      if (hasVersion()) {
        hash = (37 * hash) + VERSION_FIELD_NUMBER;
        hash = (53 * hash) + getVersion();
      }
      if (hasTimestamp()) {
        hash = (37 * hash) + TIMESTAMP_FIELD_NUMBER;
        hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
            getTimestamp());
      }
      if (hasChangeset()) {
        hash = (37 * hash) + CHANGESET_FIELD_NUMBER;
        hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
            getChangeset());
      }
      if (hasUid()) {
        hash = (37 * hash) + UID_FIELD_NUMBER;
        hash = (53 * hash) + getUid();
      }
      if (hasUserSid()) {
        hash = (37 * hash) + USER_SID_FIELD_NUMBER;
        hash = (53 * hash) + getUserSid();
      }
      if (hasVisible()) {
        hash = (37 * hash) + VISIBLE_FIELD_NUMBER;
        hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
            getVisible());
      }
      hash = (29 * hash) + unknownFields.hashCode();
      memoizedHashCode = hash;
      return hash;
    }

    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Info parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Info parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Info parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Info parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Info parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Info parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Info parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Info parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Info parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Info parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Info parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Info parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @java.lang.Override
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }
    public static Builder newBuilder(org.openstreetmap.osmosis.osmbinary.Osmformat.Info prototype) {
      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
    }
    @java.lang.Override
    public Builder toBuilder() {
      return this == DEFAULT_INSTANCE
          ? new Builder() : new Builder().mergeFrom(this);
    }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * <pre>
     * Optional metadata that may be included into each primitive. 
     * </pre>
     *
     * Protobuf type {@code OSMPBF.Info}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:OSMPBF.Info)
        org.openstreetmap.osmosis.osmbinary.Osmformat.InfoOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_Info_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_Info_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.openstreetmap.osmosis.osmbinary.Osmformat.Info.class, org.openstreetmap.osmosis.osmbinary.Osmformat.Info.Builder.class);
      }

      // Construct using org.openstreetmap.osmosis.osmbinary.Osmformat.Info.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        version_ = -1;
        bitField0_ = (bitField0_ & ~0x00000001);
        timestamp_ = 0L;
        bitField0_ = (bitField0_ & ~0x00000002);
        changeset_ = 0L;
        bitField0_ = (bitField0_ & ~0x00000004);
        uid_ = 0;
        bitField0_ = (bitField0_ & ~0x00000008);
        userSid_ = 0;
        bitField0_ = (bitField0_ & ~0x00000010);
        visible_ = false;
        bitField0_ = (bitField0_ & ~0x00000020);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_Info_descriptor;
      }

      @java.lang.Override
      public org.openstreetmap.osmosis.osmbinary.Osmformat.Info getDefaultInstanceForType() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.Info.getDefaultInstance();
      }

      @java.lang.Override
      public org.openstreetmap.osmosis.osmbinary.Osmformat.Info build() {
        org.openstreetmap.osmosis.osmbinary.Osmformat.Info result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public org.openstreetmap.osmosis.osmbinary.Osmformat.Info buildPartial() {
        org.openstreetmap.osmosis.osmbinary.Osmformat.Info result = new org.openstreetmap.osmosis.osmbinary.Osmformat.Info(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          to_bitField0_ |= 0x00000001;
        }
        result.version_ = version_;
        if (((from_bitField0_ & 0x00000002) != 0)) {
          result.timestamp_ = timestamp_;
          to_bitField0_ |= 0x00000002;
        }
        if (((from_bitField0_ & 0x00000004) != 0)) {
          result.changeset_ = changeset_;
          to_bitField0_ |= 0x00000004;
        }
        if (((from_bitField0_ & 0x00000008) != 0)) {
          result.uid_ = uid_;
          to_bitField0_ |= 0x00000008;
        }
        if (((from_bitField0_ & 0x00000010) != 0)) {
          result.userSid_ = userSid_;
          to_bitField0_ |= 0x00000010;
        }
        if (((from_bitField0_ & 0x00000020) != 0)) {
          result.visible_ = visible_;
          to_bitField0_ |= 0x00000020;
        }
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      @java.lang.Override
      public Builder clone() {
        return super.clone();
      }
      @java.lang.Override
      public Builder setField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.setField(field, value);
      }
      @java.lang.Override
      public Builder clearField(
          com.google.protobuf.Descriptors.FieldDescriptor field) {
        return super.clearField(field);
      }
      @java.lang.Override
      public Builder clearOneof(
          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
        return super.clearOneof(oneof);
      }
      @java.lang.Override
      public Builder setRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          int index, java.lang.Object value) {
        return super.setRepeatedField(field, index, value);
      }
      @java.lang.Override
      public Builder addRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.addRepeatedField(field, value);
      }
      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof org.openstreetmap.osmosis.osmbinary.Osmformat.Info) {
          return mergeFrom((org.openstreetmap.osmosis.osmbinary.Osmformat.Info)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(org.openstreetmap.osmosis.osmbinary.Osmformat.Info other) {
        if (other == org.openstreetmap.osmosis.osmbinary.Osmformat.Info.getDefaultInstance()) return this;
        if (other.hasVersion()) {
          setVersion(other.getVersion());
        }
        if (other.hasTimestamp()) {
          setTimestamp(other.getTimestamp());
        }
        if (other.hasChangeset()) {
          setChangeset(other.getChangeset());
        }
        if (other.hasUid()) {
          setUid(other.getUid());
        }
        if (other.hasUserSid()) {
          setUserSid(other.getUserSid());
        }
        if (other.hasVisible()) {
          setVisible(other.getVisible());
        }
        this.mergeUnknownFields(other.unknownFields);
        onChanged();
        return this;
      }

      @java.lang.Override
      public final boolean isInitialized() {
        return true;
      }

      @java.lang.Override
      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        org.openstreetmap.osmosis.osmbinary.Osmformat.Info parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (org.openstreetmap.osmosis.osmbinary.Osmformat.Info) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      private int version_ = -1;
      /**
       * <code>optional int32 version = 1 [default = -1];</code>
       * @return Whether the version field is set.
       */
      @java.lang.Override
      public boolean hasVersion() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <code>optional int32 version = 1 [default = -1];</code>
       * @return The version.
       */
      @java.lang.Override
      public int getVersion() {
        return version_;
      }
      /**
       * <code>optional int32 version = 1 [default = -1];</code>
       * @param value The version to set.
       * @return This builder for chaining.
       */
      public Builder setVersion(int value) {
        bitField0_ |= 0x00000001;
        version_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional int32 version = 1 [default = -1];</code>
       * @return This builder for chaining.
       */
      public Builder clearVersion() {
        bitField0_ = (bitField0_ & ~0x00000001);
        version_ = -1;
        onChanged();
        return this;
      }

      private long timestamp_ ;
      /**
       * <code>optional int64 timestamp = 2;</code>
       * @return Whether the timestamp field is set.
       */
      @java.lang.Override
      public boolean hasTimestamp() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <code>optional int64 timestamp = 2;</code>
       * @return The timestamp.
       */
      @java.lang.Override
      public long getTimestamp() {
        return timestamp_;
      }
      /**
       * <code>optional int64 timestamp = 2;</code>
       * @param value The timestamp to set.
       * @return This builder for chaining.
       */
      public Builder setTimestamp(long value) {
        bitField0_ |= 0x00000002;
        timestamp_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional int64 timestamp = 2;</code>
       * @return This builder for chaining.
       */
      public Builder clearTimestamp() {
        bitField0_ = (bitField0_ & ~0x00000002);
        timestamp_ = 0L;
        onChanged();
        return this;
      }

      private long changeset_ ;
      /**
       * <code>optional int64 changeset = 3;</code>
       * @return Whether the changeset field is set.
       */
      @java.lang.Override
      public boolean hasChangeset() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <code>optional int64 changeset = 3;</code>
       * @return The changeset.
       */
      @java.lang.Override
      public long getChangeset() {
        return changeset_;
      }
      /**
       * <code>optional int64 changeset = 3;</code>
       * @param value The changeset to set.
       * @return This builder for chaining.
       */
      public Builder setChangeset(long value) {
        bitField0_ |= 0x00000004;
        changeset_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional int64 changeset = 3;</code>
       * @return This builder for chaining.
       */
      public Builder clearChangeset() {
        bitField0_ = (bitField0_ & ~0x00000004);
        changeset_ = 0L;
        onChanged();
        return this;
      }

      private int uid_ ;
      /**
       * <code>optional int32 uid = 4;</code>
       * @return Whether the uid field is set.
       */
      @java.lang.Override
      public boolean hasUid() {
        return ((bitField0_ & 0x00000008) != 0);
      }
      /**
       * <code>optional int32 uid = 4;</code>
       * @return The uid.
       */
      @java.lang.Override
      public int getUid() {
        return uid_;
      }
      /**
       * <code>optional int32 uid = 4;</code>
       * @param value The uid to set.
       * @return This builder for chaining.
       */
      public Builder setUid(int value) {
        bitField0_ |= 0x00000008;
        uid_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional int32 uid = 4;</code>
       * @return This builder for chaining.
       */
      public Builder clearUid() {
        bitField0_ = (bitField0_ & ~0x00000008);
        uid_ = 0;
        onChanged();
        return this;
      }

      private int userSid_ ;
      /**
       * <pre>
       * String IDs
       * </pre>
       *
       * <code>optional uint32 user_sid = 5;</code>
       * @return Whether the userSid field is set.
       */
      @java.lang.Override
      public boolean hasUserSid() {
        return ((bitField0_ & 0x00000010) != 0);
      }
      /**
       * <pre>
       * String IDs
       * </pre>
       *
       * <code>optional uint32 user_sid = 5;</code>
       * @return The userSid.
       */
      @java.lang.Override
      public int getUserSid() {
        return userSid_;
      }
      /**
       * <pre>
       * String IDs
       * </pre>
       *
       * <code>optional uint32 user_sid = 5;</code>
       * @param value The userSid to set.
       * @return This builder for chaining.
       */
      public Builder setUserSid(int value) {
        bitField0_ |= 0x00000010;
        userSid_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * String IDs
       * </pre>
       *
       * <code>optional uint32 user_sid = 5;</code>
       * @return This builder for chaining.
       */
      public Builder clearUserSid() {
        bitField0_ = (bitField0_ & ~0x00000010);
        userSid_ = 0;
        onChanged();
        return this;
      }

      private boolean visible_ ;
      /**
       * <pre>
       * The visible flag is used to store history information. It indicates that
       * the current object version has been created by a delete operation on the
       * OSM API.
       * When a writer sets this flag, it MUST add a required_features tag with
       * value "HistoricalInformation" to the HeaderBlock.
       * If this flag is not available for some object it MUST be assumed to be
       * true if the file has the required_features tag "HistoricalInformation"
       * set.
       * </pre>
       *
       * <code>optional bool visible = 6;</code>
       * @return Whether the visible field is set.
       */
      @java.lang.Override
      public boolean hasVisible() {
        return ((bitField0_ & 0x00000020) != 0);
      }
      /**
       * <pre>
       * The visible flag is used to store history information. It indicates that
       * the current object version has been created by a delete operation on the
       * OSM API.
       * When a writer sets this flag, it MUST add a required_features tag with
       * value "HistoricalInformation" to the HeaderBlock.
       * If this flag is not available for some object it MUST be assumed to be
       * true if the file has the required_features tag "HistoricalInformation"
       * set.
       * </pre>
       *
       * <code>optional bool visible = 6;</code>
       * @return The visible.
       */
      @java.lang.Override
      public boolean getVisible() {
        return visible_;
      }
      /**
       * <pre>
       * The visible flag is used to store history information. It indicates that
       * the current object version has been created by a delete operation on the
       * OSM API.
       * When a writer sets this flag, it MUST add a required_features tag with
       * value "HistoricalInformation" to the HeaderBlock.
       * If this flag is not available for some object it MUST be assumed to be
       * true if the file has the required_features tag "HistoricalInformation"
       * set.
       * </pre>
       *
       * <code>optional bool visible = 6;</code>
       * @param value The visible to set.
       * @return This builder for chaining.
       */
      public Builder setVisible(boolean value) {
        bitField0_ |= 0x00000020;
        visible_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The visible flag is used to store history information. It indicates that
       * the current object version has been created by a delete operation on the
       * OSM API.
       * When a writer sets this flag, it MUST add a required_features tag with
       * value "HistoricalInformation" to the HeaderBlock.
       * If this flag is not available for some object it MUST be assumed to be
       * true if the file has the required_features tag "HistoricalInformation"
       * set.
       * </pre>
       *
       * <code>optional bool visible = 6;</code>
       * @return This builder for chaining.
       */
      public Builder clearVisible() {
        bitField0_ = (bitField0_ & ~0x00000020);
        visible_ = false;
        onChanged();
        return this;
      }
      @java.lang.Override
      public final Builder setUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.setUnknownFields(unknownFields);
      }

      @java.lang.Override
      public final Builder mergeUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.mergeUnknownFields(unknownFields);
      }


      // @@protoc_insertion_point(builder_scope:OSMPBF.Info)
    }

    // @@protoc_insertion_point(class_scope:OSMPBF.Info)
    private static final org.openstreetmap.osmosis.osmbinary.Osmformat.Info DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new org.openstreetmap.osmosis.osmbinary.Osmformat.Info();
    }

    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Info getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    @java.lang.Deprecated public static final com.google.protobuf.Parser<Info>
        PARSER = new com.google.protobuf.AbstractParser<Info>() {
      @java.lang.Override
      public Info parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new Info(input, extensionRegistry);
      }
    };

    public static com.google.protobuf.Parser<Info> parser() {
      return PARSER;
    }

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

    @java.lang.Override
    public org.openstreetmap.osmosis.osmbinary.Osmformat.Info getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface DenseInfoOrBuilder extends
      // @@protoc_insertion_point(interface_extends:OSMPBF.DenseInfo)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>repeated int32 version = 1 [packed = true];</code>
     * @return A list containing the version.
     */
    java.util.List<java.lang.Integer> getVersionList();
    /**
     * <code>repeated int32 version = 1 [packed = true];</code>
     * @return The count of version.
     */
    int getVersionCount();
    /**
     * <code>repeated int32 version = 1 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The version at the given index.
     */
    int getVersion(int index);

    /**
     * <pre>
     * DELTA coded
     * </pre>
     *
     * <code>repeated sint64 timestamp = 2 [packed = true];</code>
     * @return A list containing the timestamp.
     */
    java.util.List<java.lang.Long> getTimestampList();
    /**
     * <pre>
     * DELTA coded
     * </pre>
     *
     * <code>repeated sint64 timestamp = 2 [packed = true];</code>
     * @return The count of timestamp.
     */
    int getTimestampCount();
    /**
     * <pre>
     * DELTA coded
     * </pre>
     *
     * <code>repeated sint64 timestamp = 2 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The timestamp at the given index.
     */
    long getTimestamp(int index);

    /**
     * <pre>
     * DELTA coded
     * </pre>
     *
     * <code>repeated sint64 changeset = 3 [packed = true];</code>
     * @return A list containing the changeset.
     */
    java.util.List<java.lang.Long> getChangesetList();
    /**
     * <pre>
     * DELTA coded
     * </pre>
     *
     * <code>repeated sint64 changeset = 3 [packed = true];</code>
     * @return The count of changeset.
     */
    int getChangesetCount();
    /**
     * <pre>
     * DELTA coded
     * </pre>
     *
     * <code>repeated sint64 changeset = 3 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The changeset at the given index.
     */
    long getChangeset(int index);

    /**
     * <pre>
     * DELTA coded
     * </pre>
     *
     * <code>repeated sint32 uid = 4 [packed = true];</code>
     * @return A list containing the uid.
     */
    java.util.List<java.lang.Integer> getUidList();
    /**
     * <pre>
     * DELTA coded
     * </pre>
     *
     * <code>repeated sint32 uid = 4 [packed = true];</code>
     * @return The count of uid.
     */
    int getUidCount();
    /**
     * <pre>
     * DELTA coded
     * </pre>
     *
     * <code>repeated sint32 uid = 4 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The uid at the given index.
     */
    int getUid(int index);

    /**
     * <pre>
     * String IDs for usernames. DELTA coded
     * </pre>
     *
     * <code>repeated sint32 user_sid = 5 [packed = true];</code>
     * @return A list containing the userSid.
     */
    java.util.List<java.lang.Integer> getUserSidList();
    /**
     * <pre>
     * String IDs for usernames. DELTA coded
     * </pre>
     *
     * <code>repeated sint32 user_sid = 5 [packed = true];</code>
     * @return The count of userSid.
     */
    int getUserSidCount();
    /**
     * <pre>
     * String IDs for usernames. DELTA coded
     * </pre>
     *
     * <code>repeated sint32 user_sid = 5 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The userSid at the given index.
     */
    int getUserSid(int index);

    /**
     * <pre>
     * The visible flag is used to store history information. It indicates that
     * the current object version has been created by a delete operation on the
     * OSM API.
     * When a writer sets this flag, it MUST add a required_features tag with
     * value "HistoricalInformation" to the HeaderBlock.
     * If this flag is not available for some object it MUST be assumed to be
     * true if the file has the required_features tag "HistoricalInformation"
     * set.
     * </pre>
     *
     * <code>repeated bool visible = 6 [packed = true];</code>
     * @return A list containing the visible.
     */
    java.util.List<java.lang.Boolean> getVisibleList();
    /**
     * <pre>
     * The visible flag is used to store history information. It indicates that
     * the current object version has been created by a delete operation on the
     * OSM API.
     * When a writer sets this flag, it MUST add a required_features tag with
     * value "HistoricalInformation" to the HeaderBlock.
     * If this flag is not available for some object it MUST be assumed to be
     * true if the file has the required_features tag "HistoricalInformation"
     * set.
     * </pre>
     *
     * <code>repeated bool visible = 6 [packed = true];</code>
     * @return The count of visible.
     */
    int getVisibleCount();
    /**
     * <pre>
     * The visible flag is used to store history information. It indicates that
     * the current object version has been created by a delete operation on the
     * OSM API.
     * When a writer sets this flag, it MUST add a required_features tag with
     * value "HistoricalInformation" to the HeaderBlock.
     * If this flag is not available for some object it MUST be assumed to be
     * true if the file has the required_features tag "HistoricalInformation"
     * set.
     * </pre>
     *
     * <code>repeated bool visible = 6 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The visible at the given index.
     */
    boolean getVisible(int index);
  }
  /**
   * <pre>
   ** Optional metadata that may be included into each primitive. Special dense format used in DenseNodes. 
   * </pre>
   *
   * Protobuf type {@code OSMPBF.DenseInfo}
   */
  public static final class DenseInfo extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:OSMPBF.DenseInfo)
      DenseInfoOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use DenseInfo.newBuilder() to construct.
    private DenseInfo(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private DenseInfo() {
      version_ = emptyIntList();
      timestamp_ = emptyLongList();
      changeset_ = emptyLongList();
      uid_ = emptyIntList();
      userSid_ = emptyIntList();
      visible_ = emptyBooleanList();
    }

    @java.lang.Override
    @SuppressWarnings({"unused"})
    protected java.lang.Object newInstance(
        UnusedPrivateParameter unused) {
      return new DenseInfo();
    }

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    private DenseInfo(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      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;
            case 8: {
              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
                version_ = newIntList();
                mutable_bitField0_ |= 0x00000001;
              }
              version_.addInt(input.readInt32());
              break;
            }
            case 10: {
              int length = input.readRawVarint32();
              int limit = input.pushLimit(length);
              if (!((mutable_bitField0_ & 0x00000001) != 0) && input.getBytesUntilLimit() > 0) {
                version_ = newIntList();
                mutable_bitField0_ |= 0x00000001;
              }
              while (input.getBytesUntilLimit() > 0) {
                version_.addInt(input.readInt32());
              }
              input.popLimit(limit);
              break;
            }
            case 16: {
              if (!((mutable_bitField0_ & 0x00000002) != 0)) {
                timestamp_ = newLongList();
                mutable_bitField0_ |= 0x00000002;
              }
              timestamp_.addLong(input.readSInt64());
              break;
            }
            case 18: {
              int length = input.readRawVarint32();
              int limit = input.pushLimit(length);
              if (!((mutable_bitField0_ & 0x00000002) != 0) && input.getBytesUntilLimit() > 0) {
                timestamp_ = newLongList();
                mutable_bitField0_ |= 0x00000002;
              }
              while (input.getBytesUntilLimit() > 0) {
                timestamp_.addLong(input.readSInt64());
              }
              input.popLimit(limit);
              break;
            }
            case 24: {
              if (!((mutable_bitField0_ & 0x00000004) != 0)) {
                changeset_ = newLongList();
                mutable_bitField0_ |= 0x00000004;
              }
              changeset_.addLong(input.readSInt64());
              break;
            }
            case 26: {
              int length = input.readRawVarint32();
              int limit = input.pushLimit(length);
              if (!((mutable_bitField0_ & 0x00000004) != 0) && input.getBytesUntilLimit() > 0) {
                changeset_ = newLongList();
                mutable_bitField0_ |= 0x00000004;
              }
              while (input.getBytesUntilLimit() > 0) {
                changeset_.addLong(input.readSInt64());
              }
              input.popLimit(limit);
              break;
            }
            case 32: {
              if (!((mutable_bitField0_ & 0x00000008) != 0)) {
                uid_ = newIntList();
                mutable_bitField0_ |= 0x00000008;
              }
              uid_.addInt(input.readSInt32());
              break;
            }
            case 34: {
              int length = input.readRawVarint32();
              int limit = input.pushLimit(length);
              if (!((mutable_bitField0_ & 0x00000008) != 0) && input.getBytesUntilLimit() > 0) {
                uid_ = newIntList();
                mutable_bitField0_ |= 0x00000008;
              }
              while (input.getBytesUntilLimit() > 0) {
                uid_.addInt(input.readSInt32());
              }
              input.popLimit(limit);
              break;
            }
            case 40: {
              if (!((mutable_bitField0_ & 0x00000010) != 0)) {
                userSid_ = newIntList();
                mutable_bitField0_ |= 0x00000010;
              }
              userSid_.addInt(input.readSInt32());
              break;
            }
            case 42: {
              int length = input.readRawVarint32();
              int limit = input.pushLimit(length);
              if (!((mutable_bitField0_ & 0x00000010) != 0) && input.getBytesUntilLimit() > 0) {
                userSid_ = newIntList();
                mutable_bitField0_ |= 0x00000010;
              }
              while (input.getBytesUntilLimit() > 0) {
                userSid_.addInt(input.readSInt32());
              }
              input.popLimit(limit);
              break;
            }
            case 48: {
              if (!((mutable_bitField0_ & 0x00000020) != 0)) {
                visible_ = newBooleanList();
                mutable_bitField0_ |= 0x00000020;
              }
              visible_.addBoolean(input.readBool());
              break;
            }
            case 50: {
              int length = input.readRawVarint32();
              int limit = input.pushLimit(length);
              if (!((mutable_bitField0_ & 0x00000020) != 0) && input.getBytesUntilLimit() > 0) {
                visible_ = newBooleanList();
                mutable_bitField0_ |= 0x00000020;
              }
              while (input.getBytesUntilLimit() > 0) {
                visible_.addBoolean(input.readBool());
              }
              input.popLimit(limit);
              break;
            }
            default: {
              if (!parseUnknownField(
                  input, unknownFields, extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e).setUnfinishedMessage(this);
      } finally {
        if (((mutable_bitField0_ & 0x00000001) != 0)) {
          version_.makeImmutable(); // C
        }
        if (((mutable_bitField0_ & 0x00000002) != 0)) {
          timestamp_.makeImmutable(); // C
        }
        if (((mutable_bitField0_ & 0x00000004) != 0)) {
          changeset_.makeImmutable(); // C
        }
        if (((mutable_bitField0_ & 0x00000008) != 0)) {
          uid_.makeImmutable(); // C
        }
        if (((mutable_bitField0_ & 0x00000010) != 0)) {
          userSid_.makeImmutable(); // C
        }
        if (((mutable_bitField0_ & 0x00000020) != 0)) {
          visible_.makeImmutable(); // C
        }
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_DenseInfo_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_DenseInfo_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo.class, org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo.Builder.class);
    }

    public static final int VERSION_FIELD_NUMBER = 1;
    private com.google.protobuf.Internal.IntList version_;
    /**
     * <code>repeated int32 version = 1 [packed = true];</code>
     * @return A list containing the version.
     */
    @java.lang.Override
    public java.util.List<java.lang.Integer>
        getVersionList() {
      return version_;
    }
    /**
     * <code>repeated int32 version = 1 [packed = true];</code>
     * @return The count of version.
     */
    public int getVersionCount() {
      return version_.size();
    }
    /**
     * <code>repeated int32 version = 1 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The version at the given index.
     */
    public int getVersion(int index) {
      return version_.getInt(index);
    }
    private int versionMemoizedSerializedSize = -1;

    public static final int TIMESTAMP_FIELD_NUMBER = 2;
    private com.google.protobuf.Internal.LongList timestamp_;
    /**
     * <pre>
     * DELTA coded
     * </pre>
     *
     * <code>repeated sint64 timestamp = 2 [packed = true];</code>
     * @return A list containing the timestamp.
     */
    @java.lang.Override
    public java.util.List<java.lang.Long>
        getTimestampList() {
      return timestamp_;
    }
    /**
     * <pre>
     * DELTA coded
     * </pre>
     *
     * <code>repeated sint64 timestamp = 2 [packed = true];</code>
     * @return The count of timestamp.
     */
    public int getTimestampCount() {
      return timestamp_.size();
    }
    /**
     * <pre>
     * DELTA coded
     * </pre>
     *
     * <code>repeated sint64 timestamp = 2 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The timestamp at the given index.
     */
    public long getTimestamp(int index) {
      return timestamp_.getLong(index);
    }
    private int timestampMemoizedSerializedSize = -1;

    public static final int CHANGESET_FIELD_NUMBER = 3;
    private com.google.protobuf.Internal.LongList changeset_;
    /**
     * <pre>
     * DELTA coded
     * </pre>
     *
     * <code>repeated sint64 changeset = 3 [packed = true];</code>
     * @return A list containing the changeset.
     */
    @java.lang.Override
    public java.util.List<java.lang.Long>
        getChangesetList() {
      return changeset_;
    }
    /**
     * <pre>
     * DELTA coded
     * </pre>
     *
     * <code>repeated sint64 changeset = 3 [packed = true];</code>
     * @return The count of changeset.
     */
    public int getChangesetCount() {
      return changeset_.size();
    }
    /**
     * <pre>
     * DELTA coded
     * </pre>
     *
     * <code>repeated sint64 changeset = 3 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The changeset at the given index.
     */
    public long getChangeset(int index) {
      return changeset_.getLong(index);
    }
    private int changesetMemoizedSerializedSize = -1;

    public static final int UID_FIELD_NUMBER = 4;
    private com.google.protobuf.Internal.IntList uid_;
    /**
     * <pre>
     * DELTA coded
     * </pre>
     *
     * <code>repeated sint32 uid = 4 [packed = true];</code>
     * @return A list containing the uid.
     */
    @java.lang.Override
    public java.util.List<java.lang.Integer>
        getUidList() {
      return uid_;
    }
    /**
     * <pre>
     * DELTA coded
     * </pre>
     *
     * <code>repeated sint32 uid = 4 [packed = true];</code>
     * @return The count of uid.
     */
    public int getUidCount() {
      return uid_.size();
    }
    /**
     * <pre>
     * DELTA coded
     * </pre>
     *
     * <code>repeated sint32 uid = 4 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The uid at the given index.
     */
    public int getUid(int index) {
      return uid_.getInt(index);
    }
    private int uidMemoizedSerializedSize = -1;

    public static final int USER_SID_FIELD_NUMBER = 5;
    private com.google.protobuf.Internal.IntList userSid_;
    /**
     * <pre>
     * String IDs for usernames. DELTA coded
     * </pre>
     *
     * <code>repeated sint32 user_sid = 5 [packed = true];</code>
     * @return A list containing the userSid.
     */
    @java.lang.Override
    public java.util.List<java.lang.Integer>
        getUserSidList() {
      return userSid_;
    }
    /**
     * <pre>
     * String IDs for usernames. DELTA coded
     * </pre>
     *
     * <code>repeated sint32 user_sid = 5 [packed = true];</code>
     * @return The count of userSid.
     */
    public int getUserSidCount() {
      return userSid_.size();
    }
    /**
     * <pre>
     * String IDs for usernames. DELTA coded
     * </pre>
     *
     * <code>repeated sint32 user_sid = 5 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The userSid at the given index.
     */
    public int getUserSid(int index) {
      return userSid_.getInt(index);
    }
    private int userSidMemoizedSerializedSize = -1;

    public static final int VISIBLE_FIELD_NUMBER = 6;
    private com.google.protobuf.Internal.BooleanList visible_;
    /**
     * <pre>
     * The visible flag is used to store history information. It indicates that
     * the current object version has been created by a delete operation on the
     * OSM API.
     * When a writer sets this flag, it MUST add a required_features tag with
     * value "HistoricalInformation" to the HeaderBlock.
     * If this flag is not available for some object it MUST be assumed to be
     * true if the file has the required_features tag "HistoricalInformation"
     * set.
     * </pre>
     *
     * <code>repeated bool visible = 6 [packed = true];</code>
     * @return A list containing the visible.
     */
    @java.lang.Override
    public java.util.List<java.lang.Boolean>
        getVisibleList() {
      return visible_;
    }
    /**
     * <pre>
     * The visible flag is used to store history information. It indicates that
     * the current object version has been created by a delete operation on the
     * OSM API.
     * When a writer sets this flag, it MUST add a required_features tag with
     * value "HistoricalInformation" to the HeaderBlock.
     * If this flag is not available for some object it MUST be assumed to be
     * true if the file has the required_features tag "HistoricalInformation"
     * set.
     * </pre>
     *
     * <code>repeated bool visible = 6 [packed = true];</code>
     * @return The count of visible.
     */
    public int getVisibleCount() {
      return visible_.size();
    }
    /**
     * <pre>
     * The visible flag is used to store history information. It indicates that
     * the current object version has been created by a delete operation on the
     * OSM API.
     * When a writer sets this flag, it MUST add a required_features tag with
     * value "HistoricalInformation" to the HeaderBlock.
     * If this flag is not available for some object it MUST be assumed to be
     * true if the file has the required_features tag "HistoricalInformation"
     * set.
     * </pre>
     *
     * <code>repeated bool visible = 6 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The visible at the given index.
     */
    public boolean getVisible(int index) {
      return visible_.getBoolean(index);
    }
    private int visibleMemoizedSerializedSize = -1;

    private byte memoizedIsInitialized = -1;
    @java.lang.Override
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized == 1) return true;
      if (isInitialized == 0) return false;

      memoizedIsInitialized = 1;
      return true;
    }

    @java.lang.Override
    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      getSerializedSize();
      if (getVersionList().size() > 0) {
        output.writeUInt32NoTag(10);
        output.writeUInt32NoTag(versionMemoizedSerializedSize);
      }
      for (int i = 0; i < version_.size(); i++) {
        output.writeInt32NoTag(version_.getInt(i));
      }
      if (getTimestampList().size() > 0) {
        output.writeUInt32NoTag(18);
        output.writeUInt32NoTag(timestampMemoizedSerializedSize);
      }
      for (int i = 0; i < timestamp_.size(); i++) {
        output.writeSInt64NoTag(timestamp_.getLong(i));
      }
      if (getChangesetList().size() > 0) {
        output.writeUInt32NoTag(26);
        output.writeUInt32NoTag(changesetMemoizedSerializedSize);
      }
      for (int i = 0; i < changeset_.size(); i++) {
        output.writeSInt64NoTag(changeset_.getLong(i));
      }
      if (getUidList().size() > 0) {
        output.writeUInt32NoTag(34);
        output.writeUInt32NoTag(uidMemoizedSerializedSize);
      }
      for (int i = 0; i < uid_.size(); i++) {
        output.writeSInt32NoTag(uid_.getInt(i));
      }
      if (getUserSidList().size() > 0) {
        output.writeUInt32NoTag(42);
        output.writeUInt32NoTag(userSidMemoizedSerializedSize);
      }
      for (int i = 0; i < userSid_.size(); i++) {
        output.writeSInt32NoTag(userSid_.getInt(i));
      }
      if (getVisibleList().size() > 0) {
        output.writeUInt32NoTag(50);
        output.writeUInt32NoTag(visibleMemoizedSerializedSize);
      }
      for (int i = 0; i < visible_.size(); i++) {
        output.writeBoolNoTag(visible_.getBoolean(i));
      }
      unknownFields.writeTo(output);
    }

    @java.lang.Override
    public int getSerializedSize() {
      int size = memoizedSize;
      if (size != -1) return size;

      size = 0;
      {
        int dataSize = 0;
        for (int i = 0; i < version_.size(); i++) {
          dataSize += com.google.protobuf.CodedOutputStream
            .computeInt32SizeNoTag(version_.getInt(i));
        }
        size += dataSize;
        if (!getVersionList().isEmpty()) {
          size += 1;
          size += com.google.protobuf.CodedOutputStream
              .computeInt32SizeNoTag(dataSize);
        }
        versionMemoizedSerializedSize = dataSize;
      }
      {
        int dataSize = 0;
        for (int i = 0; i < timestamp_.size(); i++) {
          dataSize += com.google.protobuf.CodedOutputStream
            .computeSInt64SizeNoTag(timestamp_.getLong(i));
        }
        size += dataSize;
        if (!getTimestampList().isEmpty()) {
          size += 1;
          size += com.google.protobuf.CodedOutputStream
              .computeInt32SizeNoTag(dataSize);
        }
        timestampMemoizedSerializedSize = dataSize;
      }
      {
        int dataSize = 0;
        for (int i = 0; i < changeset_.size(); i++) {
          dataSize += com.google.protobuf.CodedOutputStream
            .computeSInt64SizeNoTag(changeset_.getLong(i));
        }
        size += dataSize;
        if (!getChangesetList().isEmpty()) {
          size += 1;
          size += com.google.protobuf.CodedOutputStream
              .computeInt32SizeNoTag(dataSize);
        }
        changesetMemoizedSerializedSize = dataSize;
      }
      {
        int dataSize = 0;
        for (int i = 0; i < uid_.size(); i++) {
          dataSize += com.google.protobuf.CodedOutputStream
            .computeSInt32SizeNoTag(uid_.getInt(i));
        }
        size += dataSize;
        if (!getUidList().isEmpty()) {
          size += 1;
          size += com.google.protobuf.CodedOutputStream
              .computeInt32SizeNoTag(dataSize);
        }
        uidMemoizedSerializedSize = dataSize;
      }
      {
        int dataSize = 0;
        for (int i = 0; i < userSid_.size(); i++) {
          dataSize += com.google.protobuf.CodedOutputStream
            .computeSInt32SizeNoTag(userSid_.getInt(i));
        }
        size += dataSize;
        if (!getUserSidList().isEmpty()) {
          size += 1;
          size += com.google.protobuf.CodedOutputStream
              .computeInt32SizeNoTag(dataSize);
        }
        userSidMemoizedSerializedSize = dataSize;
      }
      {
        int dataSize = 0;
        dataSize = 1 * getVisibleList().size();
        size += dataSize;
        if (!getVisibleList().isEmpty()) {
          size += 1;
          size += com.google.protobuf.CodedOutputStream
              .computeInt32SizeNoTag(dataSize);
        }
        visibleMemoizedSerializedSize = dataSize;
      }
      size += unknownFields.getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @java.lang.Override
    public boolean equals(final java.lang.Object obj) {
      if (obj == this) {
       return true;
      }
      if (!(obj instanceof org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo)) {
        return super.equals(obj);
      }
      org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo other = (org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo) obj;

      if (!getVersionList()
          .equals(other.getVersionList())) return false;
      if (!getTimestampList()
          .equals(other.getTimestampList())) return false;
      if (!getChangesetList()
          .equals(other.getChangesetList())) return false;
      if (!getUidList()
          .equals(other.getUidList())) return false;
      if (!getUserSidList()
          .equals(other.getUserSidList())) return false;
      if (!getVisibleList()
          .equals(other.getVisibleList())) return false;
      if (!unknownFields.equals(other.unknownFields)) return false;
      return true;
    }

    @java.lang.Override
    public int hashCode() {
      if (memoizedHashCode != 0) {
        return memoizedHashCode;
      }
      int hash = 41;
      hash = (19 * hash) + getDescriptor().hashCode();
      if (getVersionCount() > 0) {
        hash = (37 * hash) + VERSION_FIELD_NUMBER;
        hash = (53 * hash) + getVersionList().hashCode();
      }
      if (getTimestampCount() > 0) {
        hash = (37 * hash) + TIMESTAMP_FIELD_NUMBER;
        hash = (53 * hash) + getTimestampList().hashCode();
      }
      if (getChangesetCount() > 0) {
        hash = (37 * hash) + CHANGESET_FIELD_NUMBER;
        hash = (53 * hash) + getChangesetList().hashCode();
      }
      if (getUidCount() > 0) {
        hash = (37 * hash) + UID_FIELD_NUMBER;
        hash = (53 * hash) + getUidList().hashCode();
      }
      if (getUserSidCount() > 0) {
        hash = (37 * hash) + USER_SID_FIELD_NUMBER;
        hash = (53 * hash) + getUserSidList().hashCode();
      }
      if (getVisibleCount() > 0) {
        hash = (37 * hash) + VISIBLE_FIELD_NUMBER;
        hash = (53 * hash) + getVisibleList().hashCode();
      }
      hash = (29 * hash) + unknownFields.hashCode();
      memoizedHashCode = hash;
      return hash;
    }

    public static org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @java.lang.Override
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }
    public static Builder newBuilder(org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo prototype) {
      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
    }
    @java.lang.Override
    public Builder toBuilder() {
      return this == DEFAULT_INSTANCE
          ? new Builder() : new Builder().mergeFrom(this);
    }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * <pre>
     ** Optional metadata that may be included into each primitive. Special dense format used in DenseNodes. 
     * </pre>
     *
     * Protobuf type {@code OSMPBF.DenseInfo}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:OSMPBF.DenseInfo)
        org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfoOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_DenseInfo_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_DenseInfo_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo.class, org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo.Builder.class);
      }

      // Construct using org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        version_ = emptyIntList();
        bitField0_ = (bitField0_ & ~0x00000001);
        timestamp_ = emptyLongList();
        bitField0_ = (bitField0_ & ~0x00000002);
        changeset_ = emptyLongList();
        bitField0_ = (bitField0_ & ~0x00000004);
        uid_ = emptyIntList();
        bitField0_ = (bitField0_ & ~0x00000008);
        userSid_ = emptyIntList();
        bitField0_ = (bitField0_ & ~0x00000010);
        visible_ = emptyBooleanList();
        bitField0_ = (bitField0_ & ~0x00000020);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_DenseInfo_descriptor;
      }

      @java.lang.Override
      public org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo getDefaultInstanceForType() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo.getDefaultInstance();
      }

      @java.lang.Override
      public org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo build() {
        org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo buildPartial() {
        org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo result = new org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo(this);
        int from_bitField0_ = bitField0_;
        if (((bitField0_ & 0x00000001) != 0)) {
          version_.makeImmutable();
          bitField0_ = (bitField0_ & ~0x00000001);
        }
        result.version_ = version_;
        if (((bitField0_ & 0x00000002) != 0)) {
          timestamp_.makeImmutable();
          bitField0_ = (bitField0_ & ~0x00000002);
        }
        result.timestamp_ = timestamp_;
        if (((bitField0_ & 0x00000004) != 0)) {
          changeset_.makeImmutable();
          bitField0_ = (bitField0_ & ~0x00000004);
        }
        result.changeset_ = changeset_;
        if (((bitField0_ & 0x00000008) != 0)) {
          uid_.makeImmutable();
          bitField0_ = (bitField0_ & ~0x00000008);
        }
        result.uid_ = uid_;
        if (((bitField0_ & 0x00000010) != 0)) {
          userSid_.makeImmutable();
          bitField0_ = (bitField0_ & ~0x00000010);
        }
        result.userSid_ = userSid_;
        if (((bitField0_ & 0x00000020) != 0)) {
          visible_.makeImmutable();
          bitField0_ = (bitField0_ & ~0x00000020);
        }
        result.visible_ = visible_;
        onBuilt();
        return result;
      }

      @java.lang.Override
      public Builder clone() {
        return super.clone();
      }
      @java.lang.Override
      public Builder setField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.setField(field, value);
      }
      @java.lang.Override
      public Builder clearField(
          com.google.protobuf.Descriptors.FieldDescriptor field) {
        return super.clearField(field);
      }
      @java.lang.Override
      public Builder clearOneof(
          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
        return super.clearOneof(oneof);
      }
      @java.lang.Override
      public Builder setRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          int index, java.lang.Object value) {
        return super.setRepeatedField(field, index, value);
      }
      @java.lang.Override
      public Builder addRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.addRepeatedField(field, value);
      }
      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo) {
          return mergeFrom((org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo other) {
        if (other == org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo.getDefaultInstance()) return this;
        if (!other.version_.isEmpty()) {
          if (version_.isEmpty()) {
            version_ = other.version_;
            bitField0_ = (bitField0_ & ~0x00000001);
          } else {
            ensureVersionIsMutable();
            version_.addAll(other.version_);
          }
          onChanged();
        }
        if (!other.timestamp_.isEmpty()) {
          if (timestamp_.isEmpty()) {
            timestamp_ = other.timestamp_;
            bitField0_ = (bitField0_ & ~0x00000002);
          } else {
            ensureTimestampIsMutable();
            timestamp_.addAll(other.timestamp_);
          }
          onChanged();
        }
        if (!other.changeset_.isEmpty()) {
          if (changeset_.isEmpty()) {
            changeset_ = other.changeset_;
            bitField0_ = (bitField0_ & ~0x00000004);
          } else {
            ensureChangesetIsMutable();
            changeset_.addAll(other.changeset_);
          }
          onChanged();
        }
        if (!other.uid_.isEmpty()) {
          if (uid_.isEmpty()) {
            uid_ = other.uid_;
            bitField0_ = (bitField0_ & ~0x00000008);
          } else {
            ensureUidIsMutable();
            uid_.addAll(other.uid_);
          }
          onChanged();
        }
        if (!other.userSid_.isEmpty()) {
          if (userSid_.isEmpty()) {
            userSid_ = other.userSid_;
            bitField0_ = (bitField0_ & ~0x00000010);
          } else {
            ensureUserSidIsMutable();
            userSid_.addAll(other.userSid_);
          }
          onChanged();
        }
        if (!other.visible_.isEmpty()) {
          if (visible_.isEmpty()) {
            visible_ = other.visible_;
            bitField0_ = (bitField0_ & ~0x00000020);
          } else {
            ensureVisibleIsMutable();
            visible_.addAll(other.visible_);
          }
          onChanged();
        }
        this.mergeUnknownFields(other.unknownFields);
        onChanged();
        return this;
      }

      @java.lang.Override
      public final boolean isInitialized() {
        return true;
      }

      @java.lang.Override
      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      private com.google.protobuf.Internal.IntList version_ = emptyIntList();
      private void ensureVersionIsMutable() {
        if (!((bitField0_ & 0x00000001) != 0)) {
          version_ = mutableCopy(version_);
          bitField0_ |= 0x00000001;
         }
      }
      /**
       * <code>repeated int32 version = 1 [packed = true];</code>
       * @return A list containing the version.
       */
      public java.util.List<java.lang.Integer>
          getVersionList() {
        return ((bitField0_ & 0x00000001) != 0) ?
                 java.util.Collections.unmodifiableList(version_) : version_;
      }
      /**
       * <code>repeated int32 version = 1 [packed = true];</code>
       * @return The count of version.
       */
      public int getVersionCount() {
        return version_.size();
      }
      /**
       * <code>repeated int32 version = 1 [packed = true];</code>
       * @param index The index of the element to return.
       * @return The version at the given index.
       */
      public int getVersion(int index) {
        return version_.getInt(index);
      }
      /**
       * <code>repeated int32 version = 1 [packed = true];</code>
       * @param index The index to set the value at.
       * @param value The version to set.
       * @return This builder for chaining.
       */
      public Builder setVersion(
          int index, int value) {
        ensureVersionIsMutable();
        version_.setInt(index, value);
        onChanged();
        return this;
      }
      /**
       * <code>repeated int32 version = 1 [packed = true];</code>
       * @param value The version to add.
       * @return This builder for chaining.
       */
      public Builder addVersion(int value) {
        ensureVersionIsMutable();
        version_.addInt(value);
        onChanged();
        return this;
      }
      /**
       * <code>repeated int32 version = 1 [packed = true];</code>
       * @param values The version to add.
       * @return This builder for chaining.
       */
      public Builder addAllVersion(
          java.lang.Iterable<? extends java.lang.Integer> values) {
        ensureVersionIsMutable();
        com.google.protobuf.AbstractMessageLite.Builder.addAll(
            values, version_);
        onChanged();
        return this;
      }
      /**
       * <code>repeated int32 version = 1 [packed = true];</code>
       * @return This builder for chaining.
       */
      public Builder clearVersion() {
        version_ = emptyIntList();
        bitField0_ = (bitField0_ & ~0x00000001);
        onChanged();
        return this;
      }

      private com.google.protobuf.Internal.LongList timestamp_ = emptyLongList();
      private void ensureTimestampIsMutable() {
        if (!((bitField0_ & 0x00000002) != 0)) {
          timestamp_ = mutableCopy(timestamp_);
          bitField0_ |= 0x00000002;
         }
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint64 timestamp = 2 [packed = true];</code>
       * @return A list containing the timestamp.
       */
      public java.util.List<java.lang.Long>
          getTimestampList() {
        return ((bitField0_ & 0x00000002) != 0) ?
                 java.util.Collections.unmodifiableList(timestamp_) : timestamp_;
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint64 timestamp = 2 [packed = true];</code>
       * @return The count of timestamp.
       */
      public int getTimestampCount() {
        return timestamp_.size();
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint64 timestamp = 2 [packed = true];</code>
       * @param index The index of the element to return.
       * @return The timestamp at the given index.
       */
      public long getTimestamp(int index) {
        return timestamp_.getLong(index);
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint64 timestamp = 2 [packed = true];</code>
       * @param index The index to set the value at.
       * @param value The timestamp to set.
       * @return This builder for chaining.
       */
      public Builder setTimestamp(
          int index, long value) {
        ensureTimestampIsMutable();
        timestamp_.setLong(index, value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint64 timestamp = 2 [packed = true];</code>
       * @param value The timestamp to add.
       * @return This builder for chaining.
       */
      public Builder addTimestamp(long value) {
        ensureTimestampIsMutable();
        timestamp_.addLong(value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint64 timestamp = 2 [packed = true];</code>
       * @param values The timestamp to add.
       * @return This builder for chaining.
       */
      public Builder addAllTimestamp(
          java.lang.Iterable<? extends java.lang.Long> values) {
        ensureTimestampIsMutable();
        com.google.protobuf.AbstractMessageLite.Builder.addAll(
            values, timestamp_);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint64 timestamp = 2 [packed = true];</code>
       * @return This builder for chaining.
       */
      public Builder clearTimestamp() {
        timestamp_ = emptyLongList();
        bitField0_ = (bitField0_ & ~0x00000002);
        onChanged();
        return this;
      }

      private com.google.protobuf.Internal.LongList changeset_ = emptyLongList();
      private void ensureChangesetIsMutable() {
        if (!((bitField0_ & 0x00000004) != 0)) {
          changeset_ = mutableCopy(changeset_);
          bitField0_ |= 0x00000004;
         }
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint64 changeset = 3 [packed = true];</code>
       * @return A list containing the changeset.
       */
      public java.util.List<java.lang.Long>
          getChangesetList() {
        return ((bitField0_ & 0x00000004) != 0) ?
                 java.util.Collections.unmodifiableList(changeset_) : changeset_;
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint64 changeset = 3 [packed = true];</code>
       * @return The count of changeset.
       */
      public int getChangesetCount() {
        return changeset_.size();
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint64 changeset = 3 [packed = true];</code>
       * @param index The index of the element to return.
       * @return The changeset at the given index.
       */
      public long getChangeset(int index) {
        return changeset_.getLong(index);
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint64 changeset = 3 [packed = true];</code>
       * @param index The index to set the value at.
       * @param value The changeset to set.
       * @return This builder for chaining.
       */
      public Builder setChangeset(
          int index, long value) {
        ensureChangesetIsMutable();
        changeset_.setLong(index, value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint64 changeset = 3 [packed = true];</code>
       * @param value The changeset to add.
       * @return This builder for chaining.
       */
      public Builder addChangeset(long value) {
        ensureChangesetIsMutable();
        changeset_.addLong(value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint64 changeset = 3 [packed = true];</code>
       * @param values The changeset to add.
       * @return This builder for chaining.
       */
      public Builder addAllChangeset(
          java.lang.Iterable<? extends java.lang.Long> values) {
        ensureChangesetIsMutable();
        com.google.protobuf.AbstractMessageLite.Builder.addAll(
            values, changeset_);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint64 changeset = 3 [packed = true];</code>
       * @return This builder for chaining.
       */
      public Builder clearChangeset() {
        changeset_ = emptyLongList();
        bitField0_ = (bitField0_ & ~0x00000004);
        onChanged();
        return this;
      }

      private com.google.protobuf.Internal.IntList uid_ = emptyIntList();
      private void ensureUidIsMutable() {
        if (!((bitField0_ & 0x00000008) != 0)) {
          uid_ = mutableCopy(uid_);
          bitField0_ |= 0x00000008;
         }
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint32 uid = 4 [packed = true];</code>
       * @return A list containing the uid.
       */
      public java.util.List<java.lang.Integer>
          getUidList() {
        return ((bitField0_ & 0x00000008) != 0) ?
                 java.util.Collections.unmodifiableList(uid_) : uid_;
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint32 uid = 4 [packed = true];</code>
       * @return The count of uid.
       */
      public int getUidCount() {
        return uid_.size();
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint32 uid = 4 [packed = true];</code>
       * @param index The index of the element to return.
       * @return The uid at the given index.
       */
      public int getUid(int index) {
        return uid_.getInt(index);
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint32 uid = 4 [packed = true];</code>
       * @param index The index to set the value at.
       * @param value The uid to set.
       * @return This builder for chaining.
       */
      public Builder setUid(
          int index, int value) {
        ensureUidIsMutable();
        uid_.setInt(index, value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint32 uid = 4 [packed = true];</code>
       * @param value The uid to add.
       * @return This builder for chaining.
       */
      public Builder addUid(int value) {
        ensureUidIsMutable();
        uid_.addInt(value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint32 uid = 4 [packed = true];</code>
       * @param values The uid to add.
       * @return This builder for chaining.
       */
      public Builder addAllUid(
          java.lang.Iterable<? extends java.lang.Integer> values) {
        ensureUidIsMutable();
        com.google.protobuf.AbstractMessageLite.Builder.addAll(
            values, uid_);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint32 uid = 4 [packed = true];</code>
       * @return This builder for chaining.
       */
      public Builder clearUid() {
        uid_ = emptyIntList();
        bitField0_ = (bitField0_ & ~0x00000008);
        onChanged();
        return this;
      }

      private com.google.protobuf.Internal.IntList userSid_ = emptyIntList();
      private void ensureUserSidIsMutable() {
        if (!((bitField0_ & 0x00000010) != 0)) {
          userSid_ = mutableCopy(userSid_);
          bitField0_ |= 0x00000010;
         }
      }
      /**
       * <pre>
       * String IDs for usernames. DELTA coded
       * </pre>
       *
       * <code>repeated sint32 user_sid = 5 [packed = true];</code>
       * @return A list containing the userSid.
       */
      public java.util.List<java.lang.Integer>
          getUserSidList() {
        return ((bitField0_ & 0x00000010) != 0) ?
                 java.util.Collections.unmodifiableList(userSid_) : userSid_;
      }
      /**
       * <pre>
       * String IDs for usernames. DELTA coded
       * </pre>
       *
       * <code>repeated sint32 user_sid = 5 [packed = true];</code>
       * @return The count of userSid.
       */
      public int getUserSidCount() {
        return userSid_.size();
      }
      /**
       * <pre>
       * String IDs for usernames. DELTA coded
       * </pre>
       *
       * <code>repeated sint32 user_sid = 5 [packed = true];</code>
       * @param index The index of the element to return.
       * @return The userSid at the given index.
       */
      public int getUserSid(int index) {
        return userSid_.getInt(index);
      }
      /**
       * <pre>
       * String IDs for usernames. DELTA coded
       * </pre>
       *
       * <code>repeated sint32 user_sid = 5 [packed = true];</code>
       * @param index The index to set the value at.
       * @param value The userSid to set.
       * @return This builder for chaining.
       */
      public Builder setUserSid(
          int index, int value) {
        ensureUserSidIsMutable();
        userSid_.setInt(index, value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * String IDs for usernames. DELTA coded
       * </pre>
       *
       * <code>repeated sint32 user_sid = 5 [packed = true];</code>
       * @param value The userSid to add.
       * @return This builder for chaining.
       */
      public Builder addUserSid(int value) {
        ensureUserSidIsMutable();
        userSid_.addInt(value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * String IDs for usernames. DELTA coded
       * </pre>
       *
       * <code>repeated sint32 user_sid = 5 [packed = true];</code>
       * @param values The userSid to add.
       * @return This builder for chaining.
       */
      public Builder addAllUserSid(
          java.lang.Iterable<? extends java.lang.Integer> values) {
        ensureUserSidIsMutable();
        com.google.protobuf.AbstractMessageLite.Builder.addAll(
            values, userSid_);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * String IDs for usernames. DELTA coded
       * </pre>
       *
       * <code>repeated sint32 user_sid = 5 [packed = true];</code>
       * @return This builder for chaining.
       */
      public Builder clearUserSid() {
        userSid_ = emptyIntList();
        bitField0_ = (bitField0_ & ~0x00000010);
        onChanged();
        return this;
      }

      private com.google.protobuf.Internal.BooleanList visible_ = emptyBooleanList();
      private void ensureVisibleIsMutable() {
        if (!((bitField0_ & 0x00000020) != 0)) {
          visible_ = mutableCopy(visible_);
          bitField0_ |= 0x00000020;
         }
      }
      /**
       * <pre>
       * The visible flag is used to store history information. It indicates that
       * the current object version has been created by a delete operation on the
       * OSM API.
       * When a writer sets this flag, it MUST add a required_features tag with
       * value "HistoricalInformation" to the HeaderBlock.
       * If this flag is not available for some object it MUST be assumed to be
       * true if the file has the required_features tag "HistoricalInformation"
       * set.
       * </pre>
       *
       * <code>repeated bool visible = 6 [packed = true];</code>
       * @return A list containing the visible.
       */
      public java.util.List<java.lang.Boolean>
          getVisibleList() {
        return ((bitField0_ & 0x00000020) != 0) ?
                 java.util.Collections.unmodifiableList(visible_) : visible_;
      }
      /**
       * <pre>
       * The visible flag is used to store history information. It indicates that
       * the current object version has been created by a delete operation on the
       * OSM API.
       * When a writer sets this flag, it MUST add a required_features tag with
       * value "HistoricalInformation" to the HeaderBlock.
       * If this flag is not available for some object it MUST be assumed to be
       * true if the file has the required_features tag "HistoricalInformation"
       * set.
       * </pre>
       *
       * <code>repeated bool visible = 6 [packed = true];</code>
       * @return The count of visible.
       */
      public int getVisibleCount() {
        return visible_.size();
      }
      /**
       * <pre>
       * The visible flag is used to store history information. It indicates that
       * the current object version has been created by a delete operation on the
       * OSM API.
       * When a writer sets this flag, it MUST add a required_features tag with
       * value "HistoricalInformation" to the HeaderBlock.
       * If this flag is not available for some object it MUST be assumed to be
       * true if the file has the required_features tag "HistoricalInformation"
       * set.
       * </pre>
       *
       * <code>repeated bool visible = 6 [packed = true];</code>
       * @param index The index of the element to return.
       * @return The visible at the given index.
       */
      public boolean getVisible(int index) {
        return visible_.getBoolean(index);
      }
      /**
       * <pre>
       * The visible flag is used to store history information. It indicates that
       * the current object version has been created by a delete operation on the
       * OSM API.
       * When a writer sets this flag, it MUST add a required_features tag with
       * value "HistoricalInformation" to the HeaderBlock.
       * If this flag is not available for some object it MUST be assumed to be
       * true if the file has the required_features tag "HistoricalInformation"
       * set.
       * </pre>
       *
       * <code>repeated bool visible = 6 [packed = true];</code>
       * @param index The index to set the value at.
       * @param value The visible to set.
       * @return This builder for chaining.
       */
      public Builder setVisible(
          int index, boolean value) {
        ensureVisibleIsMutable();
        visible_.setBoolean(index, value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The visible flag is used to store history information. It indicates that
       * the current object version has been created by a delete operation on the
       * OSM API.
       * When a writer sets this flag, it MUST add a required_features tag with
       * value "HistoricalInformation" to the HeaderBlock.
       * If this flag is not available for some object it MUST be assumed to be
       * true if the file has the required_features tag "HistoricalInformation"
       * set.
       * </pre>
       *
       * <code>repeated bool visible = 6 [packed = true];</code>
       * @param value The visible to add.
       * @return This builder for chaining.
       */
      public Builder addVisible(boolean value) {
        ensureVisibleIsMutable();
        visible_.addBoolean(value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The visible flag is used to store history information. It indicates that
       * the current object version has been created by a delete operation on the
       * OSM API.
       * When a writer sets this flag, it MUST add a required_features tag with
       * value "HistoricalInformation" to the HeaderBlock.
       * If this flag is not available for some object it MUST be assumed to be
       * true if the file has the required_features tag "HistoricalInformation"
       * set.
       * </pre>
       *
       * <code>repeated bool visible = 6 [packed = true];</code>
       * @param values The visible to add.
       * @return This builder for chaining.
       */
      public Builder addAllVisible(
          java.lang.Iterable<? extends java.lang.Boolean> values) {
        ensureVisibleIsMutable();
        com.google.protobuf.AbstractMessageLite.Builder.addAll(
            values, visible_);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The visible flag is used to store history information. It indicates that
       * the current object version has been created by a delete operation on the
       * OSM API.
       * When a writer sets this flag, it MUST add a required_features tag with
       * value "HistoricalInformation" to the HeaderBlock.
       * If this flag is not available for some object it MUST be assumed to be
       * true if the file has the required_features tag "HistoricalInformation"
       * set.
       * </pre>
       *
       * <code>repeated bool visible = 6 [packed = true];</code>
       * @return This builder for chaining.
       */
      public Builder clearVisible() {
        visible_ = emptyBooleanList();
        bitField0_ = (bitField0_ & ~0x00000020);
        onChanged();
        return this;
      }
      @java.lang.Override
      public final Builder setUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.setUnknownFields(unknownFields);
      }

      @java.lang.Override
      public final Builder mergeUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.mergeUnknownFields(unknownFields);
      }


      // @@protoc_insertion_point(builder_scope:OSMPBF.DenseInfo)
    }

    // @@protoc_insertion_point(class_scope:OSMPBF.DenseInfo)
    private static final org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo();
    }

    public static org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    @java.lang.Deprecated public static final com.google.protobuf.Parser<DenseInfo>
        PARSER = new com.google.protobuf.AbstractParser<DenseInfo>() {
      @java.lang.Override
      public DenseInfo parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new DenseInfo(input, extensionRegistry);
      }
    };

    public static com.google.protobuf.Parser<DenseInfo> parser() {
      return PARSER;
    }

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

    @java.lang.Override
    public org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface ChangeSetOrBuilder extends
      // @@protoc_insertion_point(interface_extends:OSMPBF.ChangeSet)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <pre>
     *   
     *   // Parallel arrays.
     *   repeated uint32 keys = 2 [packed = true]; // String IDs.
     *   repeated uint32 vals = 3 [packed = true]; // String IDs.
     *   optional Info info = 4;
     * </pre>
     *
     * <code>required int64 id = 1;</code>
     * @return Whether the id field is set.
     */
    boolean hasId();
    /**
     * <pre>
     *   
     *   // Parallel arrays.
     *   repeated uint32 keys = 2 [packed = true]; // String IDs.
     *   repeated uint32 vals = 3 [packed = true]; // String IDs.
     *   optional Info info = 4;
     * </pre>
     *
     * <code>required int64 id = 1;</code>
     * @return The id.
     */
    long getId();
  }
  /**
   * <pre>
   * THIS IS STUB DESIGN FOR CHANGESETS. NOT USED RIGHT NOW.
   * TODO:    REMOVE THIS?
   * </pre>
   *
   * Protobuf type {@code OSMPBF.ChangeSet}
   */
  public static final class ChangeSet extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:OSMPBF.ChangeSet)
      ChangeSetOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use ChangeSet.newBuilder() to construct.
    private ChangeSet(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private ChangeSet() {
    }

    @java.lang.Override
    @SuppressWarnings({"unused"})
    protected java.lang.Object newInstance(
        UnusedPrivateParameter unused) {
      return new ChangeSet();
    }

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    private ChangeSet(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      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;
            case 8: {
              bitField0_ |= 0x00000001;
              id_ = input.readInt64();
              break;
            }
            default: {
              if (!parseUnknownField(
                  input, unknownFields, extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_ChangeSet_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_ChangeSet_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet.class, org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet.Builder.class);
    }

    private int bitField0_;
    public static final int ID_FIELD_NUMBER = 1;
    private long id_;
    /**
     * <pre>
     *   
     *   // Parallel arrays.
     *   repeated uint32 keys = 2 [packed = true]; // String IDs.
     *   repeated uint32 vals = 3 [packed = true]; // String IDs.
     *   optional Info info = 4;
     * </pre>
     *
     * <code>required int64 id = 1;</code>
     * @return Whether the id field is set.
     */
    @java.lang.Override
    public boolean hasId() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <pre>
     *   
     *   // Parallel arrays.
     *   repeated uint32 keys = 2 [packed = true]; // String IDs.
     *   repeated uint32 vals = 3 [packed = true]; // String IDs.
     *   optional Info info = 4;
     * </pre>
     *
     * <code>required int64 id = 1;</code>
     * @return The id.
     */
    @java.lang.Override
    public long getId() {
      return id_;
    }

    private byte memoizedIsInitialized = -1;
    @java.lang.Override
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized == 1) return true;
      if (isInitialized == 0) return false;

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

    @java.lang.Override
    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      if (((bitField0_ & 0x00000001) != 0)) {
        output.writeInt64(1, id_);
      }
      unknownFields.writeTo(output);
    }

    @java.lang.Override
    public int getSerializedSize() {
      int size = memoizedSize;
      if (size != -1) return size;

      size = 0;
      if (((bitField0_ & 0x00000001) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt64Size(1, id_);
      }
      size += unknownFields.getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @java.lang.Override
    public boolean equals(final java.lang.Object obj) {
      if (obj == this) {
       return true;
      }
      if (!(obj instanceof org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet)) {
        return super.equals(obj);
      }
      org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet other = (org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet) obj;

      if (hasId() != other.hasId()) return false;
      if (hasId()) {
        if (getId()
            != other.getId()) return false;
      }
      if (!unknownFields.equals(other.unknownFields)) return false;
      return true;
    }

    @java.lang.Override
    public int hashCode() {
      if (memoizedHashCode != 0) {
        return memoizedHashCode;
      }
      int hash = 41;
      hash = (19 * hash) + getDescriptor().hashCode();
      if (hasId()) {
        hash = (37 * hash) + ID_FIELD_NUMBER;
        hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
            getId());
      }
      hash = (29 * hash) + unknownFields.hashCode();
      memoizedHashCode = hash;
      return hash;
    }

    public static org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @java.lang.Override
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }
    public static Builder newBuilder(org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet prototype) {
      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
    }
    @java.lang.Override
    public Builder toBuilder() {
      return this == DEFAULT_INSTANCE
          ? new Builder() : new Builder().mergeFrom(this);
    }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * <pre>
     * THIS IS STUB DESIGN FOR CHANGESETS. NOT USED RIGHT NOW.
     * TODO:    REMOVE THIS?
     * </pre>
     *
     * Protobuf type {@code OSMPBF.ChangeSet}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:OSMPBF.ChangeSet)
        org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSetOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_ChangeSet_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_ChangeSet_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet.class, org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet.Builder.class);
      }

      // Construct using org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        id_ = 0L;
        bitField0_ = (bitField0_ & ~0x00000001);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_ChangeSet_descriptor;
      }

      @java.lang.Override
      public org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet getDefaultInstanceForType() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet.getDefaultInstance();
      }

      @java.lang.Override
      public org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet build() {
        org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet buildPartial() {
        org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet result = new org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          result.id_ = id_;
          to_bitField0_ |= 0x00000001;
        }
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      @java.lang.Override
      public Builder clone() {
        return super.clone();
      }
      @java.lang.Override
      public Builder setField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.setField(field, value);
      }
      @java.lang.Override
      public Builder clearField(
          com.google.protobuf.Descriptors.FieldDescriptor field) {
        return super.clearField(field);
      }
      @java.lang.Override
      public Builder clearOneof(
          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
        return super.clearOneof(oneof);
      }
      @java.lang.Override
      public Builder setRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          int index, java.lang.Object value) {
        return super.setRepeatedField(field, index, value);
      }
      @java.lang.Override
      public Builder addRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.addRepeatedField(field, value);
      }
      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet) {
          return mergeFrom((org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet other) {
        if (other == org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet.getDefaultInstance()) return this;
        if (other.hasId()) {
          setId(other.getId());
        }
        this.mergeUnknownFields(other.unknownFields);
        onChanged();
        return this;
      }

      @java.lang.Override
      public final boolean isInitialized() {
        if (!hasId()) {
          return false;
        }
        return true;
      }

      @java.lang.Override
      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      private long id_ ;
      /**
       * <pre>
       *   
       *   // Parallel arrays.
       *   repeated uint32 keys = 2 [packed = true]; // String IDs.
       *   repeated uint32 vals = 3 [packed = true]; // String IDs.
       *   optional Info info = 4;
       * </pre>
       *
       * <code>required int64 id = 1;</code>
       * @return Whether the id field is set.
       */
      @java.lang.Override
      public boolean hasId() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       *   
       *   // Parallel arrays.
       *   repeated uint32 keys = 2 [packed = true]; // String IDs.
       *   repeated uint32 vals = 3 [packed = true]; // String IDs.
       *   optional Info info = 4;
       * </pre>
       *
       * <code>required int64 id = 1;</code>
       * @return The id.
       */
      @java.lang.Override
      public long getId() {
        return id_;
      }
      /**
       * <pre>
       *   
       *   // Parallel arrays.
       *   repeated uint32 keys = 2 [packed = true]; // String IDs.
       *   repeated uint32 vals = 3 [packed = true]; // String IDs.
       *   optional Info info = 4;
       * </pre>
       *
       * <code>required int64 id = 1;</code>
       * @param value The id to set.
       * @return This builder for chaining.
       */
      public Builder setId(long value) {
        bitField0_ |= 0x00000001;
        id_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       *   
       *   // Parallel arrays.
       *   repeated uint32 keys = 2 [packed = true]; // String IDs.
       *   repeated uint32 vals = 3 [packed = true]; // String IDs.
       *   optional Info info = 4;
       * </pre>
       *
       * <code>required int64 id = 1;</code>
       * @return This builder for chaining.
       */
      public Builder clearId() {
        bitField0_ = (bitField0_ & ~0x00000001);
        id_ = 0L;
        onChanged();
        return this;
      }
      @java.lang.Override
      public final Builder setUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.setUnknownFields(unknownFields);
      }

      @java.lang.Override
      public final Builder mergeUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.mergeUnknownFields(unknownFields);
      }


      // @@protoc_insertion_point(builder_scope:OSMPBF.ChangeSet)
    }

    // @@protoc_insertion_point(class_scope:OSMPBF.ChangeSet)
    private static final org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet();
    }

    public static org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    @java.lang.Deprecated public static final com.google.protobuf.Parser<ChangeSet>
        PARSER = new com.google.protobuf.AbstractParser<ChangeSet>() {
      @java.lang.Override
      public ChangeSet parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new ChangeSet(input, extensionRegistry);
      }
    };

    public static com.google.protobuf.Parser<ChangeSet> parser() {
      return PARSER;
    }

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

    @java.lang.Override
    public org.openstreetmap.osmosis.osmbinary.Osmformat.ChangeSet getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface NodeOrBuilder extends
      // @@protoc_insertion_point(interface_extends:OSMPBF.Node)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>required sint64 id = 1;</code>
     * @return Whether the id field is set.
     */
    boolean hasId();
    /**
     * <code>required sint64 id = 1;</code>
     * @return The id.
     */
    long getId();

    /**
     * <pre>
     * Parallel arrays.
     * </pre>
     *
     * <code>repeated uint32 keys = 2 [packed = true];</code>
     * @return A list containing the keys.
     */
    java.util.List<java.lang.Integer> getKeysList();
    /**
     * <pre>
     * Parallel arrays.
     * </pre>
     *
     * <code>repeated uint32 keys = 2 [packed = true];</code>
     * @return The count of keys.
     */
    int getKeysCount();
    /**
     * <pre>
     * Parallel arrays.
     * </pre>
     *
     * <code>repeated uint32 keys = 2 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The keys at the given index.
     */
    int getKeys(int index);

    /**
     * <pre>
     * String IDs.
     * </pre>
     *
     * <code>repeated uint32 vals = 3 [packed = true];</code>
     * @return A list containing the vals.
     */
    java.util.List<java.lang.Integer> getValsList();
    /**
     * <pre>
     * String IDs.
     * </pre>
     *
     * <code>repeated uint32 vals = 3 [packed = true];</code>
     * @return The count of vals.
     */
    int getValsCount();
    /**
     * <pre>
     * String IDs.
     * </pre>
     *
     * <code>repeated uint32 vals = 3 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The vals at the given index.
     */
    int getVals(int index);

    /**
     * <pre>
     * May be omitted in omitmeta
     * </pre>
     *
     * <code>optional .OSMPBF.Info info = 4;</code>
     * @return Whether the info field is set.
     */
    boolean hasInfo();
    /**
     * <pre>
     * May be omitted in omitmeta
     * </pre>
     *
     * <code>optional .OSMPBF.Info info = 4;</code>
     * @return The info.
     */
    org.openstreetmap.osmosis.osmbinary.Osmformat.Info getInfo();
    /**
     * <pre>
     * May be omitted in omitmeta
     * </pre>
     *
     * <code>optional .OSMPBF.Info info = 4;</code>
     */
    org.openstreetmap.osmosis.osmbinary.Osmformat.InfoOrBuilder getInfoOrBuilder();

    /**
     * <code>required sint64 lat = 8;</code>
     * @return Whether the lat field is set.
     */
    boolean hasLat();
    /**
     * <code>required sint64 lat = 8;</code>
     * @return The lat.
     */
    long getLat();

    /**
     * <code>required sint64 lon = 9;</code>
     * @return Whether the lon field is set.
     */
    boolean hasLon();
    /**
     * <code>required sint64 lon = 9;</code>
     * @return The lon.
     */
    long getLon();
  }
  /**
   * Protobuf type {@code OSMPBF.Node}
   */
  public static final class Node extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:OSMPBF.Node)
      NodeOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use Node.newBuilder() to construct.
    private Node(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private Node() {
      keys_ = emptyIntList();
      vals_ = emptyIntList();
    }

    @java.lang.Override
    @SuppressWarnings({"unused"})
    protected java.lang.Object newInstance(
        UnusedPrivateParameter unused) {
      return new Node();
    }

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    private Node(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      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;
            case 8: {
              bitField0_ |= 0x00000001;
              id_ = input.readSInt64();
              break;
            }
            case 16: {
              if (!((mutable_bitField0_ & 0x00000002) != 0)) {
                keys_ = newIntList();
                mutable_bitField0_ |= 0x00000002;
              }
              keys_.addInt(input.readUInt32());
              break;
            }
            case 18: {
              int length = input.readRawVarint32();
              int limit = input.pushLimit(length);
              if (!((mutable_bitField0_ & 0x00000002) != 0) && input.getBytesUntilLimit() > 0) {
                keys_ = newIntList();
                mutable_bitField0_ |= 0x00000002;
              }
              while (input.getBytesUntilLimit() > 0) {
                keys_.addInt(input.readUInt32());
              }
              input.popLimit(limit);
              break;
            }
            case 24: {
              if (!((mutable_bitField0_ & 0x00000004) != 0)) {
                vals_ = newIntList();
                mutable_bitField0_ |= 0x00000004;
              }
              vals_.addInt(input.readUInt32());
              break;
            }
            case 26: {
              int length = input.readRawVarint32();
              int limit = input.pushLimit(length);
              if (!((mutable_bitField0_ & 0x00000004) != 0) && input.getBytesUntilLimit() > 0) {
                vals_ = newIntList();
                mutable_bitField0_ |= 0x00000004;
              }
              while (input.getBytesUntilLimit() > 0) {
                vals_.addInt(input.readUInt32());
              }
              input.popLimit(limit);
              break;
            }
            case 34: {
              org.openstreetmap.osmosis.osmbinary.Osmformat.Info.Builder subBuilder = null;
              if (((bitField0_ & 0x00000002) != 0)) {
                subBuilder = info_.toBuilder();
              }
              info_ = input.readMessage(org.openstreetmap.osmosis.osmbinary.Osmformat.Info.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(info_);
                info_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000002;
              break;
            }
            case 64: {
              bitField0_ |= 0x00000004;
              lat_ = input.readSInt64();
              break;
            }
            case 72: {
              bitField0_ |= 0x00000008;
              lon_ = input.readSInt64();
              break;
            }
            default: {
              if (!parseUnknownField(
                  input, unknownFields, extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e).setUnfinishedMessage(this);
      } finally {
        if (((mutable_bitField0_ & 0x00000002) != 0)) {
          keys_.makeImmutable(); // C
        }
        if (((mutable_bitField0_ & 0x00000004) != 0)) {
          vals_.makeImmutable(); // C
        }
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_Node_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_Node_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              org.openstreetmap.osmosis.osmbinary.Osmformat.Node.class, org.openstreetmap.osmosis.osmbinary.Osmformat.Node.Builder.class);
    }

    private int bitField0_;
    public static final int ID_FIELD_NUMBER = 1;
    private long id_;
    /**
     * <code>required sint64 id = 1;</code>
     * @return Whether the id field is set.
     */
    @java.lang.Override
    public boolean hasId() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <code>required sint64 id = 1;</code>
     * @return The id.
     */
    @java.lang.Override
    public long getId() {
      return id_;
    }

    public static final int KEYS_FIELD_NUMBER = 2;
    private com.google.protobuf.Internal.IntList keys_;
    /**
     * <pre>
     * Parallel arrays.
     * </pre>
     *
     * <code>repeated uint32 keys = 2 [packed = true];</code>
     * @return A list containing the keys.
     */
    @java.lang.Override
    public java.util.List<java.lang.Integer>
        getKeysList() {
      return keys_;
    }
    /**
     * <pre>
     * Parallel arrays.
     * </pre>
     *
     * <code>repeated uint32 keys = 2 [packed = true];</code>
     * @return The count of keys.
     */
    public int getKeysCount() {
      return keys_.size();
    }
    /**
     * <pre>
     * Parallel arrays.
     * </pre>
     *
     * <code>repeated uint32 keys = 2 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The keys at the given index.
     */
    public int getKeys(int index) {
      return keys_.getInt(index);
    }
    private int keysMemoizedSerializedSize = -1;

    public static final int VALS_FIELD_NUMBER = 3;
    private com.google.protobuf.Internal.IntList vals_;
    /**
     * <pre>
     * String IDs.
     * </pre>
     *
     * <code>repeated uint32 vals = 3 [packed = true];</code>
     * @return A list containing the vals.
     */
    @java.lang.Override
    public java.util.List<java.lang.Integer>
        getValsList() {
      return vals_;
    }
    /**
     * <pre>
     * String IDs.
     * </pre>
     *
     * <code>repeated uint32 vals = 3 [packed = true];</code>
     * @return The count of vals.
     */
    public int getValsCount() {
      return vals_.size();
    }
    /**
     * <pre>
     * String IDs.
     * </pre>
     *
     * <code>repeated uint32 vals = 3 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The vals at the given index.
     */
    public int getVals(int index) {
      return vals_.getInt(index);
    }
    private int valsMemoizedSerializedSize = -1;

    public static final int INFO_FIELD_NUMBER = 4;
    private org.openstreetmap.osmosis.osmbinary.Osmformat.Info info_;
    /**
     * <pre>
     * May be omitted in omitmeta
     * </pre>
     *
     * <code>optional .OSMPBF.Info info = 4;</code>
     * @return Whether the info field is set.
     */
    @java.lang.Override
    public boolean hasInfo() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <pre>
     * May be omitted in omitmeta
     * </pre>
     *
     * <code>optional .OSMPBF.Info info = 4;</code>
     * @return The info.
     */
    @java.lang.Override
    public org.openstreetmap.osmosis.osmbinary.Osmformat.Info getInfo() {
      return info_ == null ? org.openstreetmap.osmosis.osmbinary.Osmformat.Info.getDefaultInstance() : info_;
    }
    /**
     * <pre>
     * May be omitted in omitmeta
     * </pre>
     *
     * <code>optional .OSMPBF.Info info = 4;</code>
     */
    @java.lang.Override
    public org.openstreetmap.osmosis.osmbinary.Osmformat.InfoOrBuilder getInfoOrBuilder() {
      return info_ == null ? org.openstreetmap.osmosis.osmbinary.Osmformat.Info.getDefaultInstance() : info_;
    }

    public static final int LAT_FIELD_NUMBER = 8;
    private long lat_;
    /**
     * <code>required sint64 lat = 8;</code>
     * @return Whether the lat field is set.
     */
    @java.lang.Override
    public boolean hasLat() {
      return ((bitField0_ & 0x00000004) != 0);
    }
    /**
     * <code>required sint64 lat = 8;</code>
     * @return The lat.
     */
    @java.lang.Override
    public long getLat() {
      return lat_;
    }

    public static final int LON_FIELD_NUMBER = 9;
    private long lon_;
    /**
     * <code>required sint64 lon = 9;</code>
     * @return Whether the lon field is set.
     */
    @java.lang.Override
    public boolean hasLon() {
      return ((bitField0_ & 0x00000008) != 0);
    }
    /**
     * <code>required sint64 lon = 9;</code>
     * @return The lon.
     */
    @java.lang.Override
    public long getLon() {
      return lon_;
    }

    private byte memoizedIsInitialized = -1;
    @java.lang.Override
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized == 1) return true;
      if (isInitialized == 0) return false;

      if (!hasId()) {
        memoizedIsInitialized = 0;
        return false;
      }
      if (!hasLat()) {
        memoizedIsInitialized = 0;
        return false;
      }
      if (!hasLon()) {
        memoizedIsInitialized = 0;
        return false;
      }
      memoizedIsInitialized = 1;
      return true;
    }

    @java.lang.Override
    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      getSerializedSize();
      if (((bitField0_ & 0x00000001) != 0)) {
        output.writeSInt64(1, id_);
      }
      if (getKeysList().size() > 0) {
        output.writeUInt32NoTag(18);
        output.writeUInt32NoTag(keysMemoizedSerializedSize);
      }
      for (int i = 0; i < keys_.size(); i++) {
        output.writeUInt32NoTag(keys_.getInt(i));
      }
      if (getValsList().size() > 0) {
        output.writeUInt32NoTag(26);
        output.writeUInt32NoTag(valsMemoizedSerializedSize);
      }
      for (int i = 0; i < vals_.size(); i++) {
        output.writeUInt32NoTag(vals_.getInt(i));
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        output.writeMessage(4, getInfo());
      }
      if (((bitField0_ & 0x00000004) != 0)) {
        output.writeSInt64(8, lat_);
      }
      if (((bitField0_ & 0x00000008) != 0)) {
        output.writeSInt64(9, lon_);
      }
      unknownFields.writeTo(output);
    }

    @java.lang.Override
    public int getSerializedSize() {
      int size = memoizedSize;
      if (size != -1) return size;

      size = 0;
      if (((bitField0_ & 0x00000001) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeSInt64Size(1, id_);
      }
      {
        int dataSize = 0;
        for (int i = 0; i < keys_.size(); i++) {
          dataSize += com.google.protobuf.CodedOutputStream
            .computeUInt32SizeNoTag(keys_.getInt(i));
        }
        size += dataSize;
        if (!getKeysList().isEmpty()) {
          size += 1;
          size += com.google.protobuf.CodedOutputStream
              .computeInt32SizeNoTag(dataSize);
        }
        keysMemoizedSerializedSize = dataSize;
      }
      {
        int dataSize = 0;
        for (int i = 0; i < vals_.size(); i++) {
          dataSize += com.google.protobuf.CodedOutputStream
            .computeUInt32SizeNoTag(vals_.getInt(i));
        }
        size += dataSize;
        if (!getValsList().isEmpty()) {
          size += 1;
          size += com.google.protobuf.CodedOutputStream
              .computeInt32SizeNoTag(dataSize);
        }
        valsMemoizedSerializedSize = dataSize;
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(4, getInfo());
      }
      if (((bitField0_ & 0x00000004) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeSInt64Size(8, lat_);
      }
      if (((bitField0_ & 0x00000008) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeSInt64Size(9, lon_);
      }
      size += unknownFields.getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @java.lang.Override
    public boolean equals(final java.lang.Object obj) {
      if (obj == this) {
       return true;
      }
      if (!(obj instanceof org.openstreetmap.osmosis.osmbinary.Osmformat.Node)) {
        return super.equals(obj);
      }
      org.openstreetmap.osmosis.osmbinary.Osmformat.Node other = (org.openstreetmap.osmosis.osmbinary.Osmformat.Node) obj;

      if (hasId() != other.hasId()) return false;
      if (hasId()) {
        if (getId()
            != other.getId()) return false;
      }
      if (!getKeysList()
          .equals(other.getKeysList())) return false;
      if (!getValsList()
          .equals(other.getValsList())) return false;
      if (hasInfo() != other.hasInfo()) return false;
      if (hasInfo()) {
        if (!getInfo()
            .equals(other.getInfo())) return false;
      }
      if (hasLat() != other.hasLat()) return false;
      if (hasLat()) {
        if (getLat()
            != other.getLat()) return false;
      }
      if (hasLon() != other.hasLon()) return false;
      if (hasLon()) {
        if (getLon()
            != other.getLon()) return false;
      }
      if (!unknownFields.equals(other.unknownFields)) return false;
      return true;
    }

    @java.lang.Override
    public int hashCode() {
      if (memoizedHashCode != 0) {
        return memoizedHashCode;
      }
      int hash = 41;
      hash = (19 * hash) + getDescriptor().hashCode();
      if (hasId()) {
        hash = (37 * hash) + ID_FIELD_NUMBER;
        hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
            getId());
      }
      if (getKeysCount() > 0) {
        hash = (37 * hash) + KEYS_FIELD_NUMBER;
        hash = (53 * hash) + getKeysList().hashCode();
      }
      if (getValsCount() > 0) {
        hash = (37 * hash) + VALS_FIELD_NUMBER;
        hash = (53 * hash) + getValsList().hashCode();
      }
      if (hasInfo()) {
        hash = (37 * hash) + INFO_FIELD_NUMBER;
        hash = (53 * hash) + getInfo().hashCode();
      }
      if (hasLat()) {
        hash = (37 * hash) + LAT_FIELD_NUMBER;
        hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
            getLat());
      }
      if (hasLon()) {
        hash = (37 * hash) + LON_FIELD_NUMBER;
        hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
            getLon());
      }
      hash = (29 * hash) + unknownFields.hashCode();
      memoizedHashCode = hash;
      return hash;
    }

    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Node parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Node parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Node parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Node parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Node parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Node parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Node parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Node parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Node parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Node parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Node parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Node parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @java.lang.Override
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }
    public static Builder newBuilder(org.openstreetmap.osmosis.osmbinary.Osmformat.Node prototype) {
      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
    }
    @java.lang.Override
    public Builder toBuilder() {
      return this == DEFAULT_INSTANCE
          ? new Builder() : new Builder().mergeFrom(this);
    }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code OSMPBF.Node}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:OSMPBF.Node)
        org.openstreetmap.osmosis.osmbinary.Osmformat.NodeOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_Node_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_Node_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.openstreetmap.osmosis.osmbinary.Osmformat.Node.class, org.openstreetmap.osmosis.osmbinary.Osmformat.Node.Builder.class);
      }

      // Construct using org.openstreetmap.osmosis.osmbinary.Osmformat.Node.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
          getInfoFieldBuilder();
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        id_ = 0L;
        bitField0_ = (bitField0_ & ~0x00000001);
        keys_ = emptyIntList();
        bitField0_ = (bitField0_ & ~0x00000002);
        vals_ = emptyIntList();
        bitField0_ = (bitField0_ & ~0x00000004);
        if (infoBuilder_ == null) {
          info_ = null;
        } else {
          infoBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000008);
        lat_ = 0L;
        bitField0_ = (bitField0_ & ~0x00000010);
        lon_ = 0L;
        bitField0_ = (bitField0_ & ~0x00000020);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_Node_descriptor;
      }

      @java.lang.Override
      public org.openstreetmap.osmosis.osmbinary.Osmformat.Node getDefaultInstanceForType() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.Node.getDefaultInstance();
      }

      @java.lang.Override
      public org.openstreetmap.osmosis.osmbinary.Osmformat.Node build() {
        org.openstreetmap.osmosis.osmbinary.Osmformat.Node result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public org.openstreetmap.osmosis.osmbinary.Osmformat.Node buildPartial() {
        org.openstreetmap.osmosis.osmbinary.Osmformat.Node result = new org.openstreetmap.osmosis.osmbinary.Osmformat.Node(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          result.id_ = id_;
          to_bitField0_ |= 0x00000001;
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          keys_.makeImmutable();
          bitField0_ = (bitField0_ & ~0x00000002);
        }
        result.keys_ = keys_;
        if (((bitField0_ & 0x00000004) != 0)) {
          vals_.makeImmutable();
          bitField0_ = (bitField0_ & ~0x00000004);
        }
        result.vals_ = vals_;
        if (((from_bitField0_ & 0x00000008) != 0)) {
          if (infoBuilder_ == null) {
            result.info_ = info_;
          } else {
            result.info_ = infoBuilder_.build();
          }
          to_bitField0_ |= 0x00000002;
        }
        if (((from_bitField0_ & 0x00000010) != 0)) {
          result.lat_ = lat_;
          to_bitField0_ |= 0x00000004;
        }
        if (((from_bitField0_ & 0x00000020) != 0)) {
          result.lon_ = lon_;
          to_bitField0_ |= 0x00000008;
        }
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      @java.lang.Override
      public Builder clone() {
        return super.clone();
      }
      @java.lang.Override
      public Builder setField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.setField(field, value);
      }
      @java.lang.Override
      public Builder clearField(
          com.google.protobuf.Descriptors.FieldDescriptor field) {
        return super.clearField(field);
      }
      @java.lang.Override
      public Builder clearOneof(
          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
        return super.clearOneof(oneof);
      }
      @java.lang.Override
      public Builder setRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          int index, java.lang.Object value) {
        return super.setRepeatedField(field, index, value);
      }
      @java.lang.Override
      public Builder addRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.addRepeatedField(field, value);
      }
      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof org.openstreetmap.osmosis.osmbinary.Osmformat.Node) {
          return mergeFrom((org.openstreetmap.osmosis.osmbinary.Osmformat.Node)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(org.openstreetmap.osmosis.osmbinary.Osmformat.Node other) {
        if (other == org.openstreetmap.osmosis.osmbinary.Osmformat.Node.getDefaultInstance()) return this;
        if (other.hasId()) {
          setId(other.getId());
        }
        if (!other.keys_.isEmpty()) {
          if (keys_.isEmpty()) {
            keys_ = other.keys_;
            bitField0_ = (bitField0_ & ~0x00000002);
          } else {
            ensureKeysIsMutable();
            keys_.addAll(other.keys_);
          }
          onChanged();
        }
        if (!other.vals_.isEmpty()) {
          if (vals_.isEmpty()) {
            vals_ = other.vals_;
            bitField0_ = (bitField0_ & ~0x00000004);
          } else {
            ensureValsIsMutable();
            vals_.addAll(other.vals_);
          }
          onChanged();
        }
        if (other.hasInfo()) {
          mergeInfo(other.getInfo());
        }
        if (other.hasLat()) {
          setLat(other.getLat());
        }
        if (other.hasLon()) {
          setLon(other.getLon());
        }
        this.mergeUnknownFields(other.unknownFields);
        onChanged();
        return this;
      }

      @java.lang.Override
      public final boolean isInitialized() {
        if (!hasId()) {
          return false;
        }
        if (!hasLat()) {
          return false;
        }
        if (!hasLon()) {
          return false;
        }
        return true;
      }

      @java.lang.Override
      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        org.openstreetmap.osmosis.osmbinary.Osmformat.Node parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (org.openstreetmap.osmosis.osmbinary.Osmformat.Node) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      private long id_ ;
      /**
       * <code>required sint64 id = 1;</code>
       * @return Whether the id field is set.
       */
      @java.lang.Override
      public boolean hasId() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <code>required sint64 id = 1;</code>
       * @return The id.
       */
      @java.lang.Override
      public long getId() {
        return id_;
      }
      /**
       * <code>required sint64 id = 1;</code>
       * @param value The id to set.
       * @return This builder for chaining.
       */
      public Builder setId(long value) {
        bitField0_ |= 0x00000001;
        id_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>required sint64 id = 1;</code>
       * @return This builder for chaining.
       */
      public Builder clearId() {
        bitField0_ = (bitField0_ & ~0x00000001);
        id_ = 0L;
        onChanged();
        return this;
      }

      private com.google.protobuf.Internal.IntList keys_ = emptyIntList();
      private void ensureKeysIsMutable() {
        if (!((bitField0_ & 0x00000002) != 0)) {
          keys_ = mutableCopy(keys_);
          bitField0_ |= 0x00000002;
         }
      }
      /**
       * <pre>
       * Parallel arrays.
       * </pre>
       *
       * <code>repeated uint32 keys = 2 [packed = true];</code>
       * @return A list containing the keys.
       */
      public java.util.List<java.lang.Integer>
          getKeysList() {
        return ((bitField0_ & 0x00000002) != 0) ?
                 java.util.Collections.unmodifiableList(keys_) : keys_;
      }
      /**
       * <pre>
       * Parallel arrays.
       * </pre>
       *
       * <code>repeated uint32 keys = 2 [packed = true];</code>
       * @return The count of keys.
       */
      public int getKeysCount() {
        return keys_.size();
      }
      /**
       * <pre>
       * Parallel arrays.
       * </pre>
       *
       * <code>repeated uint32 keys = 2 [packed = true];</code>
       * @param index The index of the element to return.
       * @return The keys at the given index.
       */
      public int getKeys(int index) {
        return keys_.getInt(index);
      }
      /**
       * <pre>
       * Parallel arrays.
       * </pre>
       *
       * <code>repeated uint32 keys = 2 [packed = true];</code>
       * @param index The index to set the value at.
       * @param value The keys to set.
       * @return This builder for chaining.
       */
      public Builder setKeys(
          int index, int value) {
        ensureKeysIsMutable();
        keys_.setInt(index, value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Parallel arrays.
       * </pre>
       *
       * <code>repeated uint32 keys = 2 [packed = true];</code>
       * @param value The keys to add.
       * @return This builder for chaining.
       */
      public Builder addKeys(int value) {
        ensureKeysIsMutable();
        keys_.addInt(value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Parallel arrays.
       * </pre>
       *
       * <code>repeated uint32 keys = 2 [packed = true];</code>
       * @param values The keys to add.
       * @return This builder for chaining.
       */
      public Builder addAllKeys(
          java.lang.Iterable<? extends java.lang.Integer> values) {
        ensureKeysIsMutable();
        com.google.protobuf.AbstractMessageLite.Builder.addAll(
            values, keys_);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Parallel arrays.
       * </pre>
       *
       * <code>repeated uint32 keys = 2 [packed = true];</code>
       * @return This builder for chaining.
       */
      public Builder clearKeys() {
        keys_ = emptyIntList();
        bitField0_ = (bitField0_ & ~0x00000002);
        onChanged();
        return this;
      }

      private com.google.protobuf.Internal.IntList vals_ = emptyIntList();
      private void ensureValsIsMutable() {
        if (!((bitField0_ & 0x00000004) != 0)) {
          vals_ = mutableCopy(vals_);
          bitField0_ |= 0x00000004;
         }
      }
      /**
       * <pre>
       * String IDs.
       * </pre>
       *
       * <code>repeated uint32 vals = 3 [packed = true];</code>
       * @return A list containing the vals.
       */
      public java.util.List<java.lang.Integer>
          getValsList() {
        return ((bitField0_ & 0x00000004) != 0) ?
                 java.util.Collections.unmodifiableList(vals_) : vals_;
      }
      /**
       * <pre>
       * String IDs.
       * </pre>
       *
       * <code>repeated uint32 vals = 3 [packed = true];</code>
       * @return The count of vals.
       */
      public int getValsCount() {
        return vals_.size();
      }
      /**
       * <pre>
       * String IDs.
       * </pre>
       *
       * <code>repeated uint32 vals = 3 [packed = true];</code>
       * @param index The index of the element to return.
       * @return The vals at the given index.
       */
      public int getVals(int index) {
        return vals_.getInt(index);
      }
      /**
       * <pre>
       * String IDs.
       * </pre>
       *
       * <code>repeated uint32 vals = 3 [packed = true];</code>
       * @param index The index to set the value at.
       * @param value The vals to set.
       * @return This builder for chaining.
       */
      public Builder setVals(
          int index, int value) {
        ensureValsIsMutable();
        vals_.setInt(index, value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * String IDs.
       * </pre>
       *
       * <code>repeated uint32 vals = 3 [packed = true];</code>
       * @param value The vals to add.
       * @return This builder for chaining.
       */
      public Builder addVals(int value) {
        ensureValsIsMutable();
        vals_.addInt(value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * String IDs.
       * </pre>
       *
       * <code>repeated uint32 vals = 3 [packed = true];</code>
       * @param values The vals to add.
       * @return This builder for chaining.
       */
      public Builder addAllVals(
          java.lang.Iterable<? extends java.lang.Integer> values) {
        ensureValsIsMutable();
        com.google.protobuf.AbstractMessageLite.Builder.addAll(
            values, vals_);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * String IDs.
       * </pre>
       *
       * <code>repeated uint32 vals = 3 [packed = true];</code>
       * @return This builder for chaining.
       */
      public Builder clearVals() {
        vals_ = emptyIntList();
        bitField0_ = (bitField0_ & ~0x00000004);
        onChanged();
        return this;
      }

      private org.openstreetmap.osmosis.osmbinary.Osmformat.Info info_;
      private com.google.protobuf.SingleFieldBuilderV3<
          org.openstreetmap.osmosis.osmbinary.Osmformat.Info, org.openstreetmap.osmosis.osmbinary.Osmformat.Info.Builder, org.openstreetmap.osmosis.osmbinary.Osmformat.InfoOrBuilder> infoBuilder_;
      /**
       * <pre>
       * May be omitted in omitmeta
       * </pre>
       *
       * <code>optional .OSMPBF.Info info = 4;</code>
       * @return Whether the info field is set.
       */
      public boolean hasInfo() {
        return ((bitField0_ & 0x00000008) != 0);
      }
      /**
       * <pre>
       * May be omitted in omitmeta
       * </pre>
       *
       * <code>optional .OSMPBF.Info info = 4;</code>
       * @return The info.
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.Info getInfo() {
        if (infoBuilder_ == null) {
          return info_ == null ? org.openstreetmap.osmosis.osmbinary.Osmformat.Info.getDefaultInstance() : info_;
        } else {
          return infoBuilder_.getMessage();
        }
      }
      /**
       * <pre>
       * May be omitted in omitmeta
       * </pre>
       *
       * <code>optional .OSMPBF.Info info = 4;</code>
       */
      public Builder setInfo(org.openstreetmap.osmosis.osmbinary.Osmformat.Info value) {
        if (infoBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          info_ = value;
          onChanged();
        } else {
          infoBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000008;
        return this;
      }
      /**
       * <pre>
       * May be omitted in omitmeta
       * </pre>
       *
       * <code>optional .OSMPBF.Info info = 4;</code>
       */
      public Builder setInfo(
          org.openstreetmap.osmosis.osmbinary.Osmformat.Info.Builder builderForValue) {
        if (infoBuilder_ == null) {
          info_ = builderForValue.build();
          onChanged();
        } else {
          infoBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000008;
        return this;
      }
      /**
       * <pre>
       * May be omitted in omitmeta
       * </pre>
       *
       * <code>optional .OSMPBF.Info info = 4;</code>
       */
      public Builder mergeInfo(org.openstreetmap.osmosis.osmbinary.Osmformat.Info value) {
        if (infoBuilder_ == null) {
          if (((bitField0_ & 0x00000008) != 0) &&
              info_ != null &&
              info_ != org.openstreetmap.osmosis.osmbinary.Osmformat.Info.getDefaultInstance()) {
            info_ =
              org.openstreetmap.osmosis.osmbinary.Osmformat.Info.newBuilder(info_).mergeFrom(value).buildPartial();
          } else {
            info_ = value;
          }
          onChanged();
        } else {
          infoBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000008;
        return this;
      }
      /**
       * <pre>
       * May be omitted in omitmeta
       * </pre>
       *
       * <code>optional .OSMPBF.Info info = 4;</code>
       */
      public Builder clearInfo() {
        if (infoBuilder_ == null) {
          info_ = null;
          onChanged();
        } else {
          infoBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000008);
        return this;
      }
      /**
       * <pre>
       * May be omitted in omitmeta
       * </pre>
       *
       * <code>optional .OSMPBF.Info info = 4;</code>
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.Info.Builder getInfoBuilder() {
        bitField0_ |= 0x00000008;
        onChanged();
        return getInfoFieldBuilder().getBuilder();
      }
      /**
       * <pre>
       * May be omitted in omitmeta
       * </pre>
       *
       * <code>optional .OSMPBF.Info info = 4;</code>
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.InfoOrBuilder getInfoOrBuilder() {
        if (infoBuilder_ != null) {
          return infoBuilder_.getMessageOrBuilder();
        } else {
          return info_ == null ?
              org.openstreetmap.osmosis.osmbinary.Osmformat.Info.getDefaultInstance() : info_;
        }
      }
      /**
       * <pre>
       * May be omitted in omitmeta
       * </pre>
       *
       * <code>optional .OSMPBF.Info info = 4;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          org.openstreetmap.osmosis.osmbinary.Osmformat.Info, org.openstreetmap.osmosis.osmbinary.Osmformat.Info.Builder, org.openstreetmap.osmosis.osmbinary.Osmformat.InfoOrBuilder> 
          getInfoFieldBuilder() {
        if (infoBuilder_ == null) {
          infoBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              org.openstreetmap.osmosis.osmbinary.Osmformat.Info, org.openstreetmap.osmosis.osmbinary.Osmformat.Info.Builder, org.openstreetmap.osmosis.osmbinary.Osmformat.InfoOrBuilder>(
                  getInfo(),
                  getParentForChildren(),
                  isClean());
          info_ = null;
        }
        return infoBuilder_;
      }

      private long lat_ ;
      /**
       * <code>required sint64 lat = 8;</code>
       * @return Whether the lat field is set.
       */
      @java.lang.Override
      public boolean hasLat() {
        return ((bitField0_ & 0x00000010) != 0);
      }
      /**
       * <code>required sint64 lat = 8;</code>
       * @return The lat.
       */
      @java.lang.Override
      public long getLat() {
        return lat_;
      }
      /**
       * <code>required sint64 lat = 8;</code>
       * @param value The lat to set.
       * @return This builder for chaining.
       */
      public Builder setLat(long value) {
        bitField0_ |= 0x00000010;
        lat_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>required sint64 lat = 8;</code>
       * @return This builder for chaining.
       */
      public Builder clearLat() {
        bitField0_ = (bitField0_ & ~0x00000010);
        lat_ = 0L;
        onChanged();
        return this;
      }

      private long lon_ ;
      /**
       * <code>required sint64 lon = 9;</code>
       * @return Whether the lon field is set.
       */
      @java.lang.Override
      public boolean hasLon() {
        return ((bitField0_ & 0x00000020) != 0);
      }
      /**
       * <code>required sint64 lon = 9;</code>
       * @return The lon.
       */
      @java.lang.Override
      public long getLon() {
        return lon_;
      }
      /**
       * <code>required sint64 lon = 9;</code>
       * @param value The lon to set.
       * @return This builder for chaining.
       */
      public Builder setLon(long value) {
        bitField0_ |= 0x00000020;
        lon_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>required sint64 lon = 9;</code>
       * @return This builder for chaining.
       */
      public Builder clearLon() {
        bitField0_ = (bitField0_ & ~0x00000020);
        lon_ = 0L;
        onChanged();
        return this;
      }
      @java.lang.Override
      public final Builder setUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.setUnknownFields(unknownFields);
      }

      @java.lang.Override
      public final Builder mergeUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.mergeUnknownFields(unknownFields);
      }


      // @@protoc_insertion_point(builder_scope:OSMPBF.Node)
    }

    // @@protoc_insertion_point(class_scope:OSMPBF.Node)
    private static final org.openstreetmap.osmosis.osmbinary.Osmformat.Node DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new org.openstreetmap.osmosis.osmbinary.Osmformat.Node();
    }

    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Node getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    @java.lang.Deprecated public static final com.google.protobuf.Parser<Node>
        PARSER = new com.google.protobuf.AbstractParser<Node>() {
      @java.lang.Override
      public Node parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new Node(input, extensionRegistry);
      }
    };

    public static com.google.protobuf.Parser<Node> parser() {
      return PARSER;
    }

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

    @java.lang.Override
    public org.openstreetmap.osmosis.osmbinary.Osmformat.Node getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface DenseNodesOrBuilder extends
      // @@protoc_insertion_point(interface_extends:OSMPBF.DenseNodes)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <pre>
     * DELTA coded
     * </pre>
     *
     * <code>repeated sint64 id = 1 [packed = true];</code>
     * @return A list containing the id.
     */
    java.util.List<java.lang.Long> getIdList();
    /**
     * <pre>
     * DELTA coded
     * </pre>
     *
     * <code>repeated sint64 id = 1 [packed = true];</code>
     * @return The count of id.
     */
    int getIdCount();
    /**
     * <pre>
     * DELTA coded
     * </pre>
     *
     * <code>repeated sint64 id = 1 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The id at the given index.
     */
    long getId(int index);

    /**
     * <pre>
     *repeated Info info = 4;
     * </pre>
     *
     * <code>optional .OSMPBF.DenseInfo denseinfo = 5;</code>
     * @return Whether the denseinfo field is set.
     */
    boolean hasDenseinfo();
    /**
     * <pre>
     *repeated Info info = 4;
     * </pre>
     *
     * <code>optional .OSMPBF.DenseInfo denseinfo = 5;</code>
     * @return The denseinfo.
     */
    org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo getDenseinfo();
    /**
     * <pre>
     *repeated Info info = 4;
     * </pre>
     *
     * <code>optional .OSMPBF.DenseInfo denseinfo = 5;</code>
     */
    org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfoOrBuilder getDenseinfoOrBuilder();

    /**
     * <pre>
     * DELTA coded
     * </pre>
     *
     * <code>repeated sint64 lat = 8 [packed = true];</code>
     * @return A list containing the lat.
     */
    java.util.List<java.lang.Long> getLatList();
    /**
     * <pre>
     * DELTA coded
     * </pre>
     *
     * <code>repeated sint64 lat = 8 [packed = true];</code>
     * @return The count of lat.
     */
    int getLatCount();
    /**
     * <pre>
     * DELTA coded
     * </pre>
     *
     * <code>repeated sint64 lat = 8 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The lat at the given index.
     */
    long getLat(int index);

    /**
     * <pre>
     * DELTA coded
     * </pre>
     *
     * <code>repeated sint64 lon = 9 [packed = true];</code>
     * @return A list containing the lon.
     */
    java.util.List<java.lang.Long> getLonList();
    /**
     * <pre>
     * DELTA coded
     * </pre>
     *
     * <code>repeated sint64 lon = 9 [packed = true];</code>
     * @return The count of lon.
     */
    int getLonCount();
    /**
     * <pre>
     * DELTA coded
     * </pre>
     *
     * <code>repeated sint64 lon = 9 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The lon at the given index.
     */
    long getLon(int index);

    /**
     * <pre>
     * Special packing of keys and vals into one array. May be empty if all nodes in this block are tagless.
     * </pre>
     *
     * <code>repeated int32 keys_vals = 10 [packed = true];</code>
     * @return A list containing the keysVals.
     */
    java.util.List<java.lang.Integer> getKeysValsList();
    /**
     * <pre>
     * Special packing of keys and vals into one array. May be empty if all nodes in this block are tagless.
     * </pre>
     *
     * <code>repeated int32 keys_vals = 10 [packed = true];</code>
     * @return The count of keysVals.
     */
    int getKeysValsCount();
    /**
     * <pre>
     * Special packing of keys and vals into one array. May be empty if all nodes in this block are tagless.
     * </pre>
     *
     * <code>repeated int32 keys_vals = 10 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The keysVals at the given index.
     */
    int getKeysVals(int index);
  }
  /**
   * Protobuf type {@code OSMPBF.DenseNodes}
   */
  public static final class DenseNodes extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:OSMPBF.DenseNodes)
      DenseNodesOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use DenseNodes.newBuilder() to construct.
    private DenseNodes(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private DenseNodes() {
      id_ = emptyLongList();
      lat_ = emptyLongList();
      lon_ = emptyLongList();
      keysVals_ = emptyIntList();
    }

    @java.lang.Override
    @SuppressWarnings({"unused"})
    protected java.lang.Object newInstance(
        UnusedPrivateParameter unused) {
      return new DenseNodes();
    }

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    private DenseNodes(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      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;
            case 8: {
              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
                id_ = newLongList();
                mutable_bitField0_ |= 0x00000001;
              }
              id_.addLong(input.readSInt64());
              break;
            }
            case 10: {
              int length = input.readRawVarint32();
              int limit = input.pushLimit(length);
              if (!((mutable_bitField0_ & 0x00000001) != 0) && input.getBytesUntilLimit() > 0) {
                id_ = newLongList();
                mutable_bitField0_ |= 0x00000001;
              }
              while (input.getBytesUntilLimit() > 0) {
                id_.addLong(input.readSInt64());
              }
              input.popLimit(limit);
              break;
            }
            case 42: {
              org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo.Builder subBuilder = null;
              if (((bitField0_ & 0x00000001) != 0)) {
                subBuilder = denseinfo_.toBuilder();
              }
              denseinfo_ = input.readMessage(org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(denseinfo_);
                denseinfo_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000001;
              break;
            }
            case 64: {
              if (!((mutable_bitField0_ & 0x00000004) != 0)) {
                lat_ = newLongList();
                mutable_bitField0_ |= 0x00000004;
              }
              lat_.addLong(input.readSInt64());
              break;
            }
            case 66: {
              int length = input.readRawVarint32();
              int limit = input.pushLimit(length);
              if (!((mutable_bitField0_ & 0x00000004) != 0) && input.getBytesUntilLimit() > 0) {
                lat_ = newLongList();
                mutable_bitField0_ |= 0x00000004;
              }
              while (input.getBytesUntilLimit() > 0) {
                lat_.addLong(input.readSInt64());
              }
              input.popLimit(limit);
              break;
            }
            case 72: {
              if (!((mutable_bitField0_ & 0x00000008) != 0)) {
                lon_ = newLongList();
                mutable_bitField0_ |= 0x00000008;
              }
              lon_.addLong(input.readSInt64());
              break;
            }
            case 74: {
              int length = input.readRawVarint32();
              int limit = input.pushLimit(length);
              if (!((mutable_bitField0_ & 0x00000008) != 0) && input.getBytesUntilLimit() > 0) {
                lon_ = newLongList();
                mutable_bitField0_ |= 0x00000008;
              }
              while (input.getBytesUntilLimit() > 0) {
                lon_.addLong(input.readSInt64());
              }
              input.popLimit(limit);
              break;
            }
            case 80: {
              if (!((mutable_bitField0_ & 0x00000010) != 0)) {
                keysVals_ = newIntList();
                mutable_bitField0_ |= 0x00000010;
              }
              keysVals_.addInt(input.readInt32());
              break;
            }
            case 82: {
              int length = input.readRawVarint32();
              int limit = input.pushLimit(length);
              if (!((mutable_bitField0_ & 0x00000010) != 0) && input.getBytesUntilLimit() > 0) {
                keysVals_ = newIntList();
                mutable_bitField0_ |= 0x00000010;
              }
              while (input.getBytesUntilLimit() > 0) {
                keysVals_.addInt(input.readInt32());
              }
              input.popLimit(limit);
              break;
            }
            default: {
              if (!parseUnknownField(
                  input, unknownFields, extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e).setUnfinishedMessage(this);
      } finally {
        if (((mutable_bitField0_ & 0x00000001) != 0)) {
          id_.makeImmutable(); // C
        }
        if (((mutable_bitField0_ & 0x00000004) != 0)) {
          lat_.makeImmutable(); // C
        }
        if (((mutable_bitField0_ & 0x00000008) != 0)) {
          lon_.makeImmutable(); // C
        }
        if (((mutable_bitField0_ & 0x00000010) != 0)) {
          keysVals_.makeImmutable(); // C
        }
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_DenseNodes_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_DenseNodes_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes.class, org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes.Builder.class);
    }

    private int bitField0_;
    public static final int ID_FIELD_NUMBER = 1;
    private com.google.protobuf.Internal.LongList id_;
    /**
     * <pre>
     * DELTA coded
     * </pre>
     *
     * <code>repeated sint64 id = 1 [packed = true];</code>
     * @return A list containing the id.
     */
    @java.lang.Override
    public java.util.List<java.lang.Long>
        getIdList() {
      return id_;
    }
    /**
     * <pre>
     * DELTA coded
     * </pre>
     *
     * <code>repeated sint64 id = 1 [packed = true];</code>
     * @return The count of id.
     */
    public int getIdCount() {
      return id_.size();
    }
    /**
     * <pre>
     * DELTA coded
     * </pre>
     *
     * <code>repeated sint64 id = 1 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The id at the given index.
     */
    public long getId(int index) {
      return id_.getLong(index);
    }
    private int idMemoizedSerializedSize = -1;

    public static final int DENSEINFO_FIELD_NUMBER = 5;
    private org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo denseinfo_;
    /**
     * <pre>
     *repeated Info info = 4;
     * </pre>
     *
     * <code>optional .OSMPBF.DenseInfo denseinfo = 5;</code>
     * @return Whether the denseinfo field is set.
     */
    @java.lang.Override
    public boolean hasDenseinfo() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <pre>
     *repeated Info info = 4;
     * </pre>
     *
     * <code>optional .OSMPBF.DenseInfo denseinfo = 5;</code>
     * @return The denseinfo.
     */
    @java.lang.Override
    public org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo getDenseinfo() {
      return denseinfo_ == null ? org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo.getDefaultInstance() : denseinfo_;
    }
    /**
     * <pre>
     *repeated Info info = 4;
     * </pre>
     *
     * <code>optional .OSMPBF.DenseInfo denseinfo = 5;</code>
     */
    @java.lang.Override
    public org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfoOrBuilder getDenseinfoOrBuilder() {
      return denseinfo_ == null ? org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo.getDefaultInstance() : denseinfo_;
    }

    public static final int LAT_FIELD_NUMBER = 8;
    private com.google.protobuf.Internal.LongList lat_;
    /**
     * <pre>
     * DELTA coded
     * </pre>
     *
     * <code>repeated sint64 lat = 8 [packed = true];</code>
     * @return A list containing the lat.
     */
    @java.lang.Override
    public java.util.List<java.lang.Long>
        getLatList() {
      return lat_;
    }
    /**
     * <pre>
     * DELTA coded
     * </pre>
     *
     * <code>repeated sint64 lat = 8 [packed = true];</code>
     * @return The count of lat.
     */
    public int getLatCount() {
      return lat_.size();
    }
    /**
     * <pre>
     * DELTA coded
     * </pre>
     *
     * <code>repeated sint64 lat = 8 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The lat at the given index.
     */
    public long getLat(int index) {
      return lat_.getLong(index);
    }
    private int latMemoizedSerializedSize = -1;

    public static final int LON_FIELD_NUMBER = 9;
    private com.google.protobuf.Internal.LongList lon_;
    /**
     * <pre>
     * DELTA coded
     * </pre>
     *
     * <code>repeated sint64 lon = 9 [packed = true];</code>
     * @return A list containing the lon.
     */
    @java.lang.Override
    public java.util.List<java.lang.Long>
        getLonList() {
      return lon_;
    }
    /**
     * <pre>
     * DELTA coded
     * </pre>
     *
     * <code>repeated sint64 lon = 9 [packed = true];</code>
     * @return The count of lon.
     */
    public int getLonCount() {
      return lon_.size();
    }
    /**
     * <pre>
     * DELTA coded
     * </pre>
     *
     * <code>repeated sint64 lon = 9 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The lon at the given index.
     */
    public long getLon(int index) {
      return lon_.getLong(index);
    }
    private int lonMemoizedSerializedSize = -1;

    public static final int KEYS_VALS_FIELD_NUMBER = 10;
    private com.google.protobuf.Internal.IntList keysVals_;
    /**
     * <pre>
     * Special packing of keys and vals into one array. May be empty if all nodes in this block are tagless.
     * </pre>
     *
     * <code>repeated int32 keys_vals = 10 [packed = true];</code>
     * @return A list containing the keysVals.
     */
    @java.lang.Override
    public java.util.List<java.lang.Integer>
        getKeysValsList() {
      return keysVals_;
    }
    /**
     * <pre>
     * Special packing of keys and vals into one array. May be empty if all nodes in this block are tagless.
     * </pre>
     *
     * <code>repeated int32 keys_vals = 10 [packed = true];</code>
     * @return The count of keysVals.
     */
    public int getKeysValsCount() {
      return keysVals_.size();
    }
    /**
     * <pre>
     * Special packing of keys and vals into one array. May be empty if all nodes in this block are tagless.
     * </pre>
     *
     * <code>repeated int32 keys_vals = 10 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The keysVals at the given index.
     */
    public int getKeysVals(int index) {
      return keysVals_.getInt(index);
    }
    private int keysValsMemoizedSerializedSize = -1;

    private byte memoizedIsInitialized = -1;
    @java.lang.Override
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized == 1) return true;
      if (isInitialized == 0) return false;

      memoizedIsInitialized = 1;
      return true;
    }

    @java.lang.Override
    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      getSerializedSize();
      if (getIdList().size() > 0) {
        output.writeUInt32NoTag(10);
        output.writeUInt32NoTag(idMemoizedSerializedSize);
      }
      for (int i = 0; i < id_.size(); i++) {
        output.writeSInt64NoTag(id_.getLong(i));
      }
      if (((bitField0_ & 0x00000001) != 0)) {
        output.writeMessage(5, getDenseinfo());
      }
      if (getLatList().size() > 0) {
        output.writeUInt32NoTag(66);
        output.writeUInt32NoTag(latMemoizedSerializedSize);
      }
      for (int i = 0; i < lat_.size(); i++) {
        output.writeSInt64NoTag(lat_.getLong(i));
      }
      if (getLonList().size() > 0) {
        output.writeUInt32NoTag(74);
        output.writeUInt32NoTag(lonMemoizedSerializedSize);
      }
      for (int i = 0; i < lon_.size(); i++) {
        output.writeSInt64NoTag(lon_.getLong(i));
      }
      if (getKeysValsList().size() > 0) {
        output.writeUInt32NoTag(82);
        output.writeUInt32NoTag(keysValsMemoizedSerializedSize);
      }
      for (int i = 0; i < keysVals_.size(); i++) {
        output.writeInt32NoTag(keysVals_.getInt(i));
      }
      unknownFields.writeTo(output);
    }

    @java.lang.Override
    public int getSerializedSize() {
      int size = memoizedSize;
      if (size != -1) return size;

      size = 0;
      {
        int dataSize = 0;
        for (int i = 0; i < id_.size(); i++) {
          dataSize += com.google.protobuf.CodedOutputStream
            .computeSInt64SizeNoTag(id_.getLong(i));
        }
        size += dataSize;
        if (!getIdList().isEmpty()) {
          size += 1;
          size += com.google.protobuf.CodedOutputStream
              .computeInt32SizeNoTag(dataSize);
        }
        idMemoizedSerializedSize = dataSize;
      }
      if (((bitField0_ & 0x00000001) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(5, getDenseinfo());
      }
      {
        int dataSize = 0;
        for (int i = 0; i < lat_.size(); i++) {
          dataSize += com.google.protobuf.CodedOutputStream
            .computeSInt64SizeNoTag(lat_.getLong(i));
        }
        size += dataSize;
        if (!getLatList().isEmpty()) {
          size += 1;
          size += com.google.protobuf.CodedOutputStream
              .computeInt32SizeNoTag(dataSize);
        }
        latMemoizedSerializedSize = dataSize;
      }
      {
        int dataSize = 0;
        for (int i = 0; i < lon_.size(); i++) {
          dataSize += com.google.protobuf.CodedOutputStream
            .computeSInt64SizeNoTag(lon_.getLong(i));
        }
        size += dataSize;
        if (!getLonList().isEmpty()) {
          size += 1;
          size += com.google.protobuf.CodedOutputStream
              .computeInt32SizeNoTag(dataSize);
        }
        lonMemoizedSerializedSize = dataSize;
      }
      {
        int dataSize = 0;
        for (int i = 0; i < keysVals_.size(); i++) {
          dataSize += com.google.protobuf.CodedOutputStream
            .computeInt32SizeNoTag(keysVals_.getInt(i));
        }
        size += dataSize;
        if (!getKeysValsList().isEmpty()) {
          size += 1;
          size += com.google.protobuf.CodedOutputStream
              .computeInt32SizeNoTag(dataSize);
        }
        keysValsMemoizedSerializedSize = dataSize;
      }
      size += unknownFields.getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @java.lang.Override
    public boolean equals(final java.lang.Object obj) {
      if (obj == this) {
       return true;
      }
      if (!(obj instanceof org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes)) {
        return super.equals(obj);
      }
      org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes other = (org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes) obj;

      if (!getIdList()
          .equals(other.getIdList())) return false;
      if (hasDenseinfo() != other.hasDenseinfo()) return false;
      if (hasDenseinfo()) {
        if (!getDenseinfo()
            .equals(other.getDenseinfo())) return false;
      }
      if (!getLatList()
          .equals(other.getLatList())) return false;
      if (!getLonList()
          .equals(other.getLonList())) return false;
      if (!getKeysValsList()
          .equals(other.getKeysValsList())) return false;
      if (!unknownFields.equals(other.unknownFields)) return false;
      return true;
    }

    @java.lang.Override
    public int hashCode() {
      if (memoizedHashCode != 0) {
        return memoizedHashCode;
      }
      int hash = 41;
      hash = (19 * hash) + getDescriptor().hashCode();
      if (getIdCount() > 0) {
        hash = (37 * hash) + ID_FIELD_NUMBER;
        hash = (53 * hash) + getIdList().hashCode();
      }
      if (hasDenseinfo()) {
        hash = (37 * hash) + DENSEINFO_FIELD_NUMBER;
        hash = (53 * hash) + getDenseinfo().hashCode();
      }
      if (getLatCount() > 0) {
        hash = (37 * hash) + LAT_FIELD_NUMBER;
        hash = (53 * hash) + getLatList().hashCode();
      }
      if (getLonCount() > 0) {
        hash = (37 * hash) + LON_FIELD_NUMBER;
        hash = (53 * hash) + getLonList().hashCode();
      }
      if (getKeysValsCount() > 0) {
        hash = (37 * hash) + KEYS_VALS_FIELD_NUMBER;
        hash = (53 * hash) + getKeysValsList().hashCode();
      }
      hash = (29 * hash) + unknownFields.hashCode();
      memoizedHashCode = hash;
      return hash;
    }

    public static org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @java.lang.Override
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }
    public static Builder newBuilder(org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes prototype) {
      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
    }
    @java.lang.Override
    public Builder toBuilder() {
      return this == DEFAULT_INSTANCE
          ? new Builder() : new Builder().mergeFrom(this);
    }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code OSMPBF.DenseNodes}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:OSMPBF.DenseNodes)
        org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodesOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_DenseNodes_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_DenseNodes_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes.class, org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes.Builder.class);
      }

      // Construct using org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
          getDenseinfoFieldBuilder();
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        id_ = emptyLongList();
        bitField0_ = (bitField0_ & ~0x00000001);
        if (denseinfoBuilder_ == null) {
          denseinfo_ = null;
        } else {
          denseinfoBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000002);
        lat_ = emptyLongList();
        bitField0_ = (bitField0_ & ~0x00000004);
        lon_ = emptyLongList();
        bitField0_ = (bitField0_ & ~0x00000008);
        keysVals_ = emptyIntList();
        bitField0_ = (bitField0_ & ~0x00000010);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_DenseNodes_descriptor;
      }

      @java.lang.Override
      public org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes getDefaultInstanceForType() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes.getDefaultInstance();
      }

      @java.lang.Override
      public org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes build() {
        org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes buildPartial() {
        org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes result = new org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((bitField0_ & 0x00000001) != 0)) {
          id_.makeImmutable();
          bitField0_ = (bitField0_ & ~0x00000001);
        }
        result.id_ = id_;
        if (((from_bitField0_ & 0x00000002) != 0)) {
          if (denseinfoBuilder_ == null) {
            result.denseinfo_ = denseinfo_;
          } else {
            result.denseinfo_ = denseinfoBuilder_.build();
          }
          to_bitField0_ |= 0x00000001;
        }
        if (((bitField0_ & 0x00000004) != 0)) {
          lat_.makeImmutable();
          bitField0_ = (bitField0_ & ~0x00000004);
        }
        result.lat_ = lat_;
        if (((bitField0_ & 0x00000008) != 0)) {
          lon_.makeImmutable();
          bitField0_ = (bitField0_ & ~0x00000008);
        }
        result.lon_ = lon_;
        if (((bitField0_ & 0x00000010) != 0)) {
          keysVals_.makeImmutable();
          bitField0_ = (bitField0_ & ~0x00000010);
        }
        result.keysVals_ = keysVals_;
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      @java.lang.Override
      public Builder clone() {
        return super.clone();
      }
      @java.lang.Override
      public Builder setField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.setField(field, value);
      }
      @java.lang.Override
      public Builder clearField(
          com.google.protobuf.Descriptors.FieldDescriptor field) {
        return super.clearField(field);
      }
      @java.lang.Override
      public Builder clearOneof(
          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
        return super.clearOneof(oneof);
      }
      @java.lang.Override
      public Builder setRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          int index, java.lang.Object value) {
        return super.setRepeatedField(field, index, value);
      }
      @java.lang.Override
      public Builder addRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.addRepeatedField(field, value);
      }
      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes) {
          return mergeFrom((org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes other) {
        if (other == org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes.getDefaultInstance()) return this;
        if (!other.id_.isEmpty()) {
          if (id_.isEmpty()) {
            id_ = other.id_;
            bitField0_ = (bitField0_ & ~0x00000001);
          } else {
            ensureIdIsMutable();
            id_.addAll(other.id_);
          }
          onChanged();
        }
        if (other.hasDenseinfo()) {
          mergeDenseinfo(other.getDenseinfo());
        }
        if (!other.lat_.isEmpty()) {
          if (lat_.isEmpty()) {
            lat_ = other.lat_;
            bitField0_ = (bitField0_ & ~0x00000004);
          } else {
            ensureLatIsMutable();
            lat_.addAll(other.lat_);
          }
          onChanged();
        }
        if (!other.lon_.isEmpty()) {
          if (lon_.isEmpty()) {
            lon_ = other.lon_;
            bitField0_ = (bitField0_ & ~0x00000008);
          } else {
            ensureLonIsMutable();
            lon_.addAll(other.lon_);
          }
          onChanged();
        }
        if (!other.keysVals_.isEmpty()) {
          if (keysVals_.isEmpty()) {
            keysVals_ = other.keysVals_;
            bitField0_ = (bitField0_ & ~0x00000010);
          } else {
            ensureKeysValsIsMutable();
            keysVals_.addAll(other.keysVals_);
          }
          onChanged();
        }
        this.mergeUnknownFields(other.unknownFields);
        onChanged();
        return this;
      }

      @java.lang.Override
      public final boolean isInitialized() {
        return true;
      }

      @java.lang.Override
      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      private com.google.protobuf.Internal.LongList id_ = emptyLongList();
      private void ensureIdIsMutable() {
        if (!((bitField0_ & 0x00000001) != 0)) {
          id_ = mutableCopy(id_);
          bitField0_ |= 0x00000001;
         }
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint64 id = 1 [packed = true];</code>
       * @return A list containing the id.
       */
      public java.util.List<java.lang.Long>
          getIdList() {
        return ((bitField0_ & 0x00000001) != 0) ?
                 java.util.Collections.unmodifiableList(id_) : id_;
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint64 id = 1 [packed = true];</code>
       * @return The count of id.
       */
      public int getIdCount() {
        return id_.size();
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint64 id = 1 [packed = true];</code>
       * @param index The index of the element to return.
       * @return The id at the given index.
       */
      public long getId(int index) {
        return id_.getLong(index);
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint64 id = 1 [packed = true];</code>
       * @param index The index to set the value at.
       * @param value The id to set.
       * @return This builder for chaining.
       */
      public Builder setId(
          int index, long value) {
        ensureIdIsMutable();
        id_.setLong(index, value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint64 id = 1 [packed = true];</code>
       * @param value The id to add.
       * @return This builder for chaining.
       */
      public Builder addId(long value) {
        ensureIdIsMutable();
        id_.addLong(value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint64 id = 1 [packed = true];</code>
       * @param values The id to add.
       * @return This builder for chaining.
       */
      public Builder addAllId(
          java.lang.Iterable<? extends java.lang.Long> values) {
        ensureIdIsMutable();
        com.google.protobuf.AbstractMessageLite.Builder.addAll(
            values, id_);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint64 id = 1 [packed = true];</code>
       * @return This builder for chaining.
       */
      public Builder clearId() {
        id_ = emptyLongList();
        bitField0_ = (bitField0_ & ~0x00000001);
        onChanged();
        return this;
      }

      private org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo denseinfo_;
      private com.google.protobuf.SingleFieldBuilderV3<
          org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo, org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo.Builder, org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfoOrBuilder> denseinfoBuilder_;
      /**
       * <pre>
       *repeated Info info = 4;
       * </pre>
       *
       * <code>optional .OSMPBF.DenseInfo denseinfo = 5;</code>
       * @return Whether the denseinfo field is set.
       */
      public boolean hasDenseinfo() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <pre>
       *repeated Info info = 4;
       * </pre>
       *
       * <code>optional .OSMPBF.DenseInfo denseinfo = 5;</code>
       * @return The denseinfo.
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo getDenseinfo() {
        if (denseinfoBuilder_ == null) {
          return denseinfo_ == null ? org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo.getDefaultInstance() : denseinfo_;
        } else {
          return denseinfoBuilder_.getMessage();
        }
      }
      /**
       * <pre>
       *repeated Info info = 4;
       * </pre>
       *
       * <code>optional .OSMPBF.DenseInfo denseinfo = 5;</code>
       */
      public Builder setDenseinfo(org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo value) {
        if (denseinfoBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          denseinfo_ = value;
          onChanged();
        } else {
          denseinfoBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000002;
        return this;
      }
      /**
       * <pre>
       *repeated Info info = 4;
       * </pre>
       *
       * <code>optional .OSMPBF.DenseInfo denseinfo = 5;</code>
       */
      public Builder setDenseinfo(
          org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo.Builder builderForValue) {
        if (denseinfoBuilder_ == null) {
          denseinfo_ = builderForValue.build();
          onChanged();
        } else {
          denseinfoBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000002;
        return this;
      }
      /**
       * <pre>
       *repeated Info info = 4;
       * </pre>
       *
       * <code>optional .OSMPBF.DenseInfo denseinfo = 5;</code>
       */
      public Builder mergeDenseinfo(org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo value) {
        if (denseinfoBuilder_ == null) {
          if (((bitField0_ & 0x00000002) != 0) &&
              denseinfo_ != null &&
              denseinfo_ != org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo.getDefaultInstance()) {
            denseinfo_ =
              org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo.newBuilder(denseinfo_).mergeFrom(value).buildPartial();
          } else {
            denseinfo_ = value;
          }
          onChanged();
        } else {
          denseinfoBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000002;
        return this;
      }
      /**
       * <pre>
       *repeated Info info = 4;
       * </pre>
       *
       * <code>optional .OSMPBF.DenseInfo denseinfo = 5;</code>
       */
      public Builder clearDenseinfo() {
        if (denseinfoBuilder_ == null) {
          denseinfo_ = null;
          onChanged();
        } else {
          denseinfoBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000002);
        return this;
      }
      /**
       * <pre>
       *repeated Info info = 4;
       * </pre>
       *
       * <code>optional .OSMPBF.DenseInfo denseinfo = 5;</code>
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo.Builder getDenseinfoBuilder() {
        bitField0_ |= 0x00000002;
        onChanged();
        return getDenseinfoFieldBuilder().getBuilder();
      }
      /**
       * <pre>
       *repeated Info info = 4;
       * </pre>
       *
       * <code>optional .OSMPBF.DenseInfo denseinfo = 5;</code>
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfoOrBuilder getDenseinfoOrBuilder() {
        if (denseinfoBuilder_ != null) {
          return denseinfoBuilder_.getMessageOrBuilder();
        } else {
          return denseinfo_ == null ?
              org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo.getDefaultInstance() : denseinfo_;
        }
      }
      /**
       * <pre>
       *repeated Info info = 4;
       * </pre>
       *
       * <code>optional .OSMPBF.DenseInfo denseinfo = 5;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo, org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo.Builder, org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfoOrBuilder> 
          getDenseinfoFieldBuilder() {
        if (denseinfoBuilder_ == null) {
          denseinfoBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo, org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfo.Builder, org.openstreetmap.osmosis.osmbinary.Osmformat.DenseInfoOrBuilder>(
                  getDenseinfo(),
                  getParentForChildren(),
                  isClean());
          denseinfo_ = null;
        }
        return denseinfoBuilder_;
      }

      private com.google.protobuf.Internal.LongList lat_ = emptyLongList();
      private void ensureLatIsMutable() {
        if (!((bitField0_ & 0x00000004) != 0)) {
          lat_ = mutableCopy(lat_);
          bitField0_ |= 0x00000004;
         }
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint64 lat = 8 [packed = true];</code>
       * @return A list containing the lat.
       */
      public java.util.List<java.lang.Long>
          getLatList() {
        return ((bitField0_ & 0x00000004) != 0) ?
                 java.util.Collections.unmodifiableList(lat_) : lat_;
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint64 lat = 8 [packed = true];</code>
       * @return The count of lat.
       */
      public int getLatCount() {
        return lat_.size();
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint64 lat = 8 [packed = true];</code>
       * @param index The index of the element to return.
       * @return The lat at the given index.
       */
      public long getLat(int index) {
        return lat_.getLong(index);
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint64 lat = 8 [packed = true];</code>
       * @param index The index to set the value at.
       * @param value The lat to set.
       * @return This builder for chaining.
       */
      public Builder setLat(
          int index, long value) {
        ensureLatIsMutable();
        lat_.setLong(index, value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint64 lat = 8 [packed = true];</code>
       * @param value The lat to add.
       * @return This builder for chaining.
       */
      public Builder addLat(long value) {
        ensureLatIsMutable();
        lat_.addLong(value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint64 lat = 8 [packed = true];</code>
       * @param values The lat to add.
       * @return This builder for chaining.
       */
      public Builder addAllLat(
          java.lang.Iterable<? extends java.lang.Long> values) {
        ensureLatIsMutable();
        com.google.protobuf.AbstractMessageLite.Builder.addAll(
            values, lat_);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint64 lat = 8 [packed = true];</code>
       * @return This builder for chaining.
       */
      public Builder clearLat() {
        lat_ = emptyLongList();
        bitField0_ = (bitField0_ & ~0x00000004);
        onChanged();
        return this;
      }

      private com.google.protobuf.Internal.LongList lon_ = emptyLongList();
      private void ensureLonIsMutable() {
        if (!((bitField0_ & 0x00000008) != 0)) {
          lon_ = mutableCopy(lon_);
          bitField0_ |= 0x00000008;
         }
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint64 lon = 9 [packed = true];</code>
       * @return A list containing the lon.
       */
      public java.util.List<java.lang.Long>
          getLonList() {
        return ((bitField0_ & 0x00000008) != 0) ?
                 java.util.Collections.unmodifiableList(lon_) : lon_;
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint64 lon = 9 [packed = true];</code>
       * @return The count of lon.
       */
      public int getLonCount() {
        return lon_.size();
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint64 lon = 9 [packed = true];</code>
       * @param index The index of the element to return.
       * @return The lon at the given index.
       */
      public long getLon(int index) {
        return lon_.getLong(index);
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint64 lon = 9 [packed = true];</code>
       * @param index The index to set the value at.
       * @param value The lon to set.
       * @return This builder for chaining.
       */
      public Builder setLon(
          int index, long value) {
        ensureLonIsMutable();
        lon_.setLong(index, value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint64 lon = 9 [packed = true];</code>
       * @param value The lon to add.
       * @return This builder for chaining.
       */
      public Builder addLon(long value) {
        ensureLonIsMutable();
        lon_.addLong(value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint64 lon = 9 [packed = true];</code>
       * @param values The lon to add.
       * @return This builder for chaining.
       */
      public Builder addAllLon(
          java.lang.Iterable<? extends java.lang.Long> values) {
        ensureLonIsMutable();
        com.google.protobuf.AbstractMessageLite.Builder.addAll(
            values, lon_);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint64 lon = 9 [packed = true];</code>
       * @return This builder for chaining.
       */
      public Builder clearLon() {
        lon_ = emptyLongList();
        bitField0_ = (bitField0_ & ~0x00000008);
        onChanged();
        return this;
      }

      private com.google.protobuf.Internal.IntList keysVals_ = emptyIntList();
      private void ensureKeysValsIsMutable() {
        if (!((bitField0_ & 0x00000010) != 0)) {
          keysVals_ = mutableCopy(keysVals_);
          bitField0_ |= 0x00000010;
         }
      }
      /**
       * <pre>
       * Special packing of keys and vals into one array. May be empty if all nodes in this block are tagless.
       * </pre>
       *
       * <code>repeated int32 keys_vals = 10 [packed = true];</code>
       * @return A list containing the keysVals.
       */
      public java.util.List<java.lang.Integer>
          getKeysValsList() {
        return ((bitField0_ & 0x00000010) != 0) ?
                 java.util.Collections.unmodifiableList(keysVals_) : keysVals_;
      }
      /**
       * <pre>
       * Special packing of keys and vals into one array. May be empty if all nodes in this block are tagless.
       * </pre>
       *
       * <code>repeated int32 keys_vals = 10 [packed = true];</code>
       * @return The count of keysVals.
       */
      public int getKeysValsCount() {
        return keysVals_.size();
      }
      /**
       * <pre>
       * Special packing of keys and vals into one array. May be empty if all nodes in this block are tagless.
       * </pre>
       *
       * <code>repeated int32 keys_vals = 10 [packed = true];</code>
       * @param index The index of the element to return.
       * @return The keysVals at the given index.
       */
      public int getKeysVals(int index) {
        return keysVals_.getInt(index);
      }
      /**
       * <pre>
       * Special packing of keys and vals into one array. May be empty if all nodes in this block are tagless.
       * </pre>
       *
       * <code>repeated int32 keys_vals = 10 [packed = true];</code>
       * @param index The index to set the value at.
       * @param value The keysVals to set.
       * @return This builder for chaining.
       */
      public Builder setKeysVals(
          int index, int value) {
        ensureKeysValsIsMutable();
        keysVals_.setInt(index, value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Special packing of keys and vals into one array. May be empty if all nodes in this block are tagless.
       * </pre>
       *
       * <code>repeated int32 keys_vals = 10 [packed = true];</code>
       * @param value The keysVals to add.
       * @return This builder for chaining.
       */
      public Builder addKeysVals(int value) {
        ensureKeysValsIsMutable();
        keysVals_.addInt(value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Special packing of keys and vals into one array. May be empty if all nodes in this block are tagless.
       * </pre>
       *
       * <code>repeated int32 keys_vals = 10 [packed = true];</code>
       * @param values The keysVals to add.
       * @return This builder for chaining.
       */
      public Builder addAllKeysVals(
          java.lang.Iterable<? extends java.lang.Integer> values) {
        ensureKeysValsIsMutable();
        com.google.protobuf.AbstractMessageLite.Builder.addAll(
            values, keysVals_);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Special packing of keys and vals into one array. May be empty if all nodes in this block are tagless.
       * </pre>
       *
       * <code>repeated int32 keys_vals = 10 [packed = true];</code>
       * @return This builder for chaining.
       */
      public Builder clearKeysVals() {
        keysVals_ = emptyIntList();
        bitField0_ = (bitField0_ & ~0x00000010);
        onChanged();
        return this;
      }
      @java.lang.Override
      public final Builder setUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.setUnknownFields(unknownFields);
      }

      @java.lang.Override
      public final Builder mergeUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.mergeUnknownFields(unknownFields);
      }


      // @@protoc_insertion_point(builder_scope:OSMPBF.DenseNodes)
    }

    // @@protoc_insertion_point(class_scope:OSMPBF.DenseNodes)
    private static final org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes();
    }

    public static org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    @java.lang.Deprecated public static final com.google.protobuf.Parser<DenseNodes>
        PARSER = new com.google.protobuf.AbstractParser<DenseNodes>() {
      @java.lang.Override
      public DenseNodes parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new DenseNodes(input, extensionRegistry);
      }
    };

    public static com.google.protobuf.Parser<DenseNodes> parser() {
      return PARSER;
    }

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

    @java.lang.Override
    public org.openstreetmap.osmosis.osmbinary.Osmformat.DenseNodes getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface WayOrBuilder extends
      // @@protoc_insertion_point(interface_extends:OSMPBF.Way)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>required int64 id = 1;</code>
     * @return Whether the id field is set.
     */
    boolean hasId();
    /**
     * <code>required int64 id = 1;</code>
     * @return The id.
     */
    long getId();

    /**
     * <pre>
     * Parallel arrays.
     * </pre>
     *
     * <code>repeated uint32 keys = 2 [packed = true];</code>
     * @return A list containing the keys.
     */
    java.util.List<java.lang.Integer> getKeysList();
    /**
     * <pre>
     * Parallel arrays.
     * </pre>
     *
     * <code>repeated uint32 keys = 2 [packed = true];</code>
     * @return The count of keys.
     */
    int getKeysCount();
    /**
     * <pre>
     * Parallel arrays.
     * </pre>
     *
     * <code>repeated uint32 keys = 2 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The keys at the given index.
     */
    int getKeys(int index);

    /**
     * <code>repeated uint32 vals = 3 [packed = true];</code>
     * @return A list containing the vals.
     */
    java.util.List<java.lang.Integer> getValsList();
    /**
     * <code>repeated uint32 vals = 3 [packed = true];</code>
     * @return The count of vals.
     */
    int getValsCount();
    /**
     * <code>repeated uint32 vals = 3 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The vals at the given index.
     */
    int getVals(int index);

    /**
     * <code>optional .OSMPBF.Info info = 4;</code>
     * @return Whether the info field is set.
     */
    boolean hasInfo();
    /**
     * <code>optional .OSMPBF.Info info = 4;</code>
     * @return The info.
     */
    org.openstreetmap.osmosis.osmbinary.Osmformat.Info getInfo();
    /**
     * <code>optional .OSMPBF.Info info = 4;</code>
     */
    org.openstreetmap.osmosis.osmbinary.Osmformat.InfoOrBuilder getInfoOrBuilder();

    /**
     * <pre>
     * DELTA coded
     * </pre>
     *
     * <code>repeated sint64 refs = 8 [packed = true];</code>
     * @return A list containing the refs.
     */
    java.util.List<java.lang.Long> getRefsList();
    /**
     * <pre>
     * DELTA coded
     * </pre>
     *
     * <code>repeated sint64 refs = 8 [packed = true];</code>
     * @return The count of refs.
     */
    int getRefsCount();
    /**
     * <pre>
     * DELTA coded
     * </pre>
     *
     * <code>repeated sint64 refs = 8 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The refs at the given index.
     */
    long getRefs(int index);

    /**
     * <code>repeated sint64 lat = 9 [packed = true];</code>
     * @return A list containing the lat.
     */
    java.util.List<java.lang.Long> getLatList();
    /**
     * <code>repeated sint64 lat = 9 [packed = true];</code>
     * @return The count of lat.
     */
    int getLatCount();
    /**
     * <code>repeated sint64 lat = 9 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The lat at the given index.
     */
    long getLat(int index);

    /**
     * <code>repeated sint64 lon = 10 [packed = true];</code>
     * @return A list containing the lon.
     */
    java.util.List<java.lang.Long> getLonList();
    /**
     * <code>repeated sint64 lon = 10 [packed = true];</code>
     * @return The count of lon.
     */
    int getLonCount();
    /**
     * <code>repeated sint64 lon = 10 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The lon at the given index.
     */
    long getLon(int index);
  }
  /**
   * Protobuf type {@code OSMPBF.Way}
   */
  public static final class Way extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:OSMPBF.Way)
      WayOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use Way.newBuilder() to construct.
    private Way(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private Way() {
      keys_ = emptyIntList();
      vals_ = emptyIntList();
      refs_ = emptyLongList();
      lat_ = emptyLongList();
      lon_ = emptyLongList();
    }

    @java.lang.Override
    @SuppressWarnings({"unused"})
    protected java.lang.Object newInstance(
        UnusedPrivateParameter unused) {
      return new Way();
    }

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    private Way(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      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;
            case 8: {
              bitField0_ |= 0x00000001;
              id_ = input.readInt64();
              break;
            }
            case 16: {
              if (!((mutable_bitField0_ & 0x00000002) != 0)) {
                keys_ = newIntList();
                mutable_bitField0_ |= 0x00000002;
              }
              keys_.addInt(input.readUInt32());
              break;
            }
            case 18: {
              int length = input.readRawVarint32();
              int limit = input.pushLimit(length);
              if (!((mutable_bitField0_ & 0x00000002) != 0) && input.getBytesUntilLimit() > 0) {
                keys_ = newIntList();
                mutable_bitField0_ |= 0x00000002;
              }
              while (input.getBytesUntilLimit() > 0) {
                keys_.addInt(input.readUInt32());
              }
              input.popLimit(limit);
              break;
            }
            case 24: {
              if (!((mutable_bitField0_ & 0x00000004) != 0)) {
                vals_ = newIntList();
                mutable_bitField0_ |= 0x00000004;
              }
              vals_.addInt(input.readUInt32());
              break;
            }
            case 26: {
              int length = input.readRawVarint32();
              int limit = input.pushLimit(length);
              if (!((mutable_bitField0_ & 0x00000004) != 0) && input.getBytesUntilLimit() > 0) {
                vals_ = newIntList();
                mutable_bitField0_ |= 0x00000004;
              }
              while (input.getBytesUntilLimit() > 0) {
                vals_.addInt(input.readUInt32());
              }
              input.popLimit(limit);
              break;
            }
            case 34: {
              org.openstreetmap.osmosis.osmbinary.Osmformat.Info.Builder subBuilder = null;
              if (((bitField0_ & 0x00000002) != 0)) {
                subBuilder = info_.toBuilder();
              }
              info_ = input.readMessage(org.openstreetmap.osmosis.osmbinary.Osmformat.Info.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(info_);
                info_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000002;
              break;
            }
            case 64: {
              if (!((mutable_bitField0_ & 0x00000010) != 0)) {
                refs_ = newLongList();
                mutable_bitField0_ |= 0x00000010;
              }
              refs_.addLong(input.readSInt64());
              break;
            }
            case 66: {
              int length = input.readRawVarint32();
              int limit = input.pushLimit(length);
              if (!((mutable_bitField0_ & 0x00000010) != 0) && input.getBytesUntilLimit() > 0) {
                refs_ = newLongList();
                mutable_bitField0_ |= 0x00000010;
              }
              while (input.getBytesUntilLimit() > 0) {
                refs_.addLong(input.readSInt64());
              }
              input.popLimit(limit);
              break;
            }
            case 72: {
              if (!((mutable_bitField0_ & 0x00000020) != 0)) {
                lat_ = newLongList();
                mutable_bitField0_ |= 0x00000020;
              }
              lat_.addLong(input.readSInt64());
              break;
            }
            case 74: {
              int length = input.readRawVarint32();
              int limit = input.pushLimit(length);
              if (!((mutable_bitField0_ & 0x00000020) != 0) && input.getBytesUntilLimit() > 0) {
                lat_ = newLongList();
                mutable_bitField0_ |= 0x00000020;
              }
              while (input.getBytesUntilLimit() > 0) {
                lat_.addLong(input.readSInt64());
              }
              input.popLimit(limit);
              break;
            }
            case 80: {
              if (!((mutable_bitField0_ & 0x00000040) != 0)) {
                lon_ = newLongList();
                mutable_bitField0_ |= 0x00000040;
              }
              lon_.addLong(input.readSInt64());
              break;
            }
            case 82: {
              int length = input.readRawVarint32();
              int limit = input.pushLimit(length);
              if (!((mutable_bitField0_ & 0x00000040) != 0) && input.getBytesUntilLimit() > 0) {
                lon_ = newLongList();
                mutable_bitField0_ |= 0x00000040;
              }
              while (input.getBytesUntilLimit() > 0) {
                lon_.addLong(input.readSInt64());
              }
              input.popLimit(limit);
              break;
            }
            default: {
              if (!parseUnknownField(
                  input, unknownFields, extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e).setUnfinishedMessage(this);
      } finally {
        if (((mutable_bitField0_ & 0x00000002) != 0)) {
          keys_.makeImmutable(); // C
        }
        if (((mutable_bitField0_ & 0x00000004) != 0)) {
          vals_.makeImmutable(); // C
        }
        if (((mutable_bitField0_ & 0x00000010) != 0)) {
          refs_.makeImmutable(); // C
        }
        if (((mutable_bitField0_ & 0x00000020) != 0)) {
          lat_.makeImmutable(); // C
        }
        if (((mutable_bitField0_ & 0x00000040) != 0)) {
          lon_.makeImmutable(); // C
        }
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_Way_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_Way_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              org.openstreetmap.osmosis.osmbinary.Osmformat.Way.class, org.openstreetmap.osmosis.osmbinary.Osmformat.Way.Builder.class);
    }

    private int bitField0_;
    public static final int ID_FIELD_NUMBER = 1;
    private long id_;
    /**
     * <code>required int64 id = 1;</code>
     * @return Whether the id field is set.
     */
    @java.lang.Override
    public boolean hasId() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <code>required int64 id = 1;</code>
     * @return The id.
     */
    @java.lang.Override
    public long getId() {
      return id_;
    }

    public static final int KEYS_FIELD_NUMBER = 2;
    private com.google.protobuf.Internal.IntList keys_;
    /**
     * <pre>
     * Parallel arrays.
     * </pre>
     *
     * <code>repeated uint32 keys = 2 [packed = true];</code>
     * @return A list containing the keys.
     */
    @java.lang.Override
    public java.util.List<java.lang.Integer>
        getKeysList() {
      return keys_;
    }
    /**
     * <pre>
     * Parallel arrays.
     * </pre>
     *
     * <code>repeated uint32 keys = 2 [packed = true];</code>
     * @return The count of keys.
     */
    public int getKeysCount() {
      return keys_.size();
    }
    /**
     * <pre>
     * Parallel arrays.
     * </pre>
     *
     * <code>repeated uint32 keys = 2 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The keys at the given index.
     */
    public int getKeys(int index) {
      return keys_.getInt(index);
    }
    private int keysMemoizedSerializedSize = -1;

    public static final int VALS_FIELD_NUMBER = 3;
    private com.google.protobuf.Internal.IntList vals_;
    /**
     * <code>repeated uint32 vals = 3 [packed = true];</code>
     * @return A list containing the vals.
     */
    @java.lang.Override
    public java.util.List<java.lang.Integer>
        getValsList() {
      return vals_;
    }
    /**
     * <code>repeated uint32 vals = 3 [packed = true];</code>
     * @return The count of vals.
     */
    public int getValsCount() {
      return vals_.size();
    }
    /**
     * <code>repeated uint32 vals = 3 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The vals at the given index.
     */
    public int getVals(int index) {
      return vals_.getInt(index);
    }
    private int valsMemoizedSerializedSize = -1;

    public static final int INFO_FIELD_NUMBER = 4;
    private org.openstreetmap.osmosis.osmbinary.Osmformat.Info info_;
    /**
     * <code>optional .OSMPBF.Info info = 4;</code>
     * @return Whether the info field is set.
     */
    @java.lang.Override
    public boolean hasInfo() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <code>optional .OSMPBF.Info info = 4;</code>
     * @return The info.
     */
    @java.lang.Override
    public org.openstreetmap.osmosis.osmbinary.Osmformat.Info getInfo() {
      return info_ == null ? org.openstreetmap.osmosis.osmbinary.Osmformat.Info.getDefaultInstance() : info_;
    }
    /**
     * <code>optional .OSMPBF.Info info = 4;</code>
     */
    @java.lang.Override
    public org.openstreetmap.osmosis.osmbinary.Osmformat.InfoOrBuilder getInfoOrBuilder() {
      return info_ == null ? org.openstreetmap.osmosis.osmbinary.Osmformat.Info.getDefaultInstance() : info_;
    }

    public static final int REFS_FIELD_NUMBER = 8;
    private com.google.protobuf.Internal.LongList refs_;
    /**
     * <pre>
     * DELTA coded
     * </pre>
     *
     * <code>repeated sint64 refs = 8 [packed = true];</code>
     * @return A list containing the refs.
     */
    @java.lang.Override
    public java.util.List<java.lang.Long>
        getRefsList() {
      return refs_;
    }
    /**
     * <pre>
     * DELTA coded
     * </pre>
     *
     * <code>repeated sint64 refs = 8 [packed = true];</code>
     * @return The count of refs.
     */
    public int getRefsCount() {
      return refs_.size();
    }
    /**
     * <pre>
     * DELTA coded
     * </pre>
     *
     * <code>repeated sint64 refs = 8 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The refs at the given index.
     */
    public long getRefs(int index) {
      return refs_.getLong(index);
    }
    private int refsMemoizedSerializedSize = -1;

    public static final int LAT_FIELD_NUMBER = 9;
    private com.google.protobuf.Internal.LongList lat_;
    /**
     * <code>repeated sint64 lat = 9 [packed = true];</code>
     * @return A list containing the lat.
     */
    @java.lang.Override
    public java.util.List<java.lang.Long>
        getLatList() {
      return lat_;
    }
    /**
     * <code>repeated sint64 lat = 9 [packed = true];</code>
     * @return The count of lat.
     */
    public int getLatCount() {
      return lat_.size();
    }
    /**
     * <code>repeated sint64 lat = 9 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The lat at the given index.
     */
    public long getLat(int index) {
      return lat_.getLong(index);
    }
    private int latMemoizedSerializedSize = -1;

    public static final int LON_FIELD_NUMBER = 10;
    private com.google.protobuf.Internal.LongList lon_;
    /**
     * <code>repeated sint64 lon = 10 [packed = true];</code>
     * @return A list containing the lon.
     */
    @java.lang.Override
    public java.util.List<java.lang.Long>
        getLonList() {
      return lon_;
    }
    /**
     * <code>repeated sint64 lon = 10 [packed = true];</code>
     * @return The count of lon.
     */
    public int getLonCount() {
      return lon_.size();
    }
    /**
     * <code>repeated sint64 lon = 10 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The lon at the given index.
     */
    public long getLon(int index) {
      return lon_.getLong(index);
    }
    private int lonMemoizedSerializedSize = -1;

    private byte memoizedIsInitialized = -1;
    @java.lang.Override
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized == 1) return true;
      if (isInitialized == 0) return false;

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

    @java.lang.Override
    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      getSerializedSize();
      if (((bitField0_ & 0x00000001) != 0)) {
        output.writeInt64(1, id_);
      }
      if (getKeysList().size() > 0) {
        output.writeUInt32NoTag(18);
        output.writeUInt32NoTag(keysMemoizedSerializedSize);
      }
      for (int i = 0; i < keys_.size(); i++) {
        output.writeUInt32NoTag(keys_.getInt(i));
      }
      if (getValsList().size() > 0) {
        output.writeUInt32NoTag(26);
        output.writeUInt32NoTag(valsMemoizedSerializedSize);
      }
      for (int i = 0; i < vals_.size(); i++) {
        output.writeUInt32NoTag(vals_.getInt(i));
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        output.writeMessage(4, getInfo());
      }
      if (getRefsList().size() > 0) {
        output.writeUInt32NoTag(66);
        output.writeUInt32NoTag(refsMemoizedSerializedSize);
      }
      for (int i = 0; i < refs_.size(); i++) {
        output.writeSInt64NoTag(refs_.getLong(i));
      }
      if (getLatList().size() > 0) {
        output.writeUInt32NoTag(74);
        output.writeUInt32NoTag(latMemoizedSerializedSize);
      }
      for (int i = 0; i < lat_.size(); i++) {
        output.writeSInt64NoTag(lat_.getLong(i));
      }
      if (getLonList().size() > 0) {
        output.writeUInt32NoTag(82);
        output.writeUInt32NoTag(lonMemoizedSerializedSize);
      }
      for (int i = 0; i < lon_.size(); i++) {
        output.writeSInt64NoTag(lon_.getLong(i));
      }
      unknownFields.writeTo(output);
    }

    @java.lang.Override
    public int getSerializedSize() {
      int size = memoizedSize;
      if (size != -1) return size;

      size = 0;
      if (((bitField0_ & 0x00000001) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt64Size(1, id_);
      }
      {
        int dataSize = 0;
        for (int i = 0; i < keys_.size(); i++) {
          dataSize += com.google.protobuf.CodedOutputStream
            .computeUInt32SizeNoTag(keys_.getInt(i));
        }
        size += dataSize;
        if (!getKeysList().isEmpty()) {
          size += 1;
          size += com.google.protobuf.CodedOutputStream
              .computeInt32SizeNoTag(dataSize);
        }
        keysMemoizedSerializedSize = dataSize;
      }
      {
        int dataSize = 0;
        for (int i = 0; i < vals_.size(); i++) {
          dataSize += com.google.protobuf.CodedOutputStream
            .computeUInt32SizeNoTag(vals_.getInt(i));
        }
        size += dataSize;
        if (!getValsList().isEmpty()) {
          size += 1;
          size += com.google.protobuf.CodedOutputStream
              .computeInt32SizeNoTag(dataSize);
        }
        valsMemoizedSerializedSize = dataSize;
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(4, getInfo());
      }
      {
        int dataSize = 0;
        for (int i = 0; i < refs_.size(); i++) {
          dataSize += com.google.protobuf.CodedOutputStream
            .computeSInt64SizeNoTag(refs_.getLong(i));
        }
        size += dataSize;
        if (!getRefsList().isEmpty()) {
          size += 1;
          size += com.google.protobuf.CodedOutputStream
              .computeInt32SizeNoTag(dataSize);
        }
        refsMemoizedSerializedSize = dataSize;
      }
      {
        int dataSize = 0;
        for (int i = 0; i < lat_.size(); i++) {
          dataSize += com.google.protobuf.CodedOutputStream
            .computeSInt64SizeNoTag(lat_.getLong(i));
        }
        size += dataSize;
        if (!getLatList().isEmpty()) {
          size += 1;
          size += com.google.protobuf.CodedOutputStream
              .computeInt32SizeNoTag(dataSize);
        }
        latMemoizedSerializedSize = dataSize;
      }
      {
        int dataSize = 0;
        for (int i = 0; i < lon_.size(); i++) {
          dataSize += com.google.protobuf.CodedOutputStream
            .computeSInt64SizeNoTag(lon_.getLong(i));
        }
        size += dataSize;
        if (!getLonList().isEmpty()) {
          size += 1;
          size += com.google.protobuf.CodedOutputStream
              .computeInt32SizeNoTag(dataSize);
        }
        lonMemoizedSerializedSize = dataSize;
      }
      size += unknownFields.getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @java.lang.Override
    public boolean equals(final java.lang.Object obj) {
      if (obj == this) {
       return true;
      }
      if (!(obj instanceof org.openstreetmap.osmosis.osmbinary.Osmformat.Way)) {
        return super.equals(obj);
      }
      org.openstreetmap.osmosis.osmbinary.Osmformat.Way other = (org.openstreetmap.osmosis.osmbinary.Osmformat.Way) obj;

      if (hasId() != other.hasId()) return false;
      if (hasId()) {
        if (getId()
            != other.getId()) return false;
      }
      if (!getKeysList()
          .equals(other.getKeysList())) return false;
      if (!getValsList()
          .equals(other.getValsList())) return false;
      if (hasInfo() != other.hasInfo()) return false;
      if (hasInfo()) {
        if (!getInfo()
            .equals(other.getInfo())) return false;
      }
      if (!getRefsList()
          .equals(other.getRefsList())) return false;
      if (!getLatList()
          .equals(other.getLatList())) return false;
      if (!getLonList()
          .equals(other.getLonList())) return false;
      if (!unknownFields.equals(other.unknownFields)) return false;
      return true;
    }

    @java.lang.Override
    public int hashCode() {
      if (memoizedHashCode != 0) {
        return memoizedHashCode;
      }
      int hash = 41;
      hash = (19 * hash) + getDescriptor().hashCode();
      if (hasId()) {
        hash = (37 * hash) + ID_FIELD_NUMBER;
        hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
            getId());
      }
      if (getKeysCount() > 0) {
        hash = (37 * hash) + KEYS_FIELD_NUMBER;
        hash = (53 * hash) + getKeysList().hashCode();
      }
      if (getValsCount() > 0) {
        hash = (37 * hash) + VALS_FIELD_NUMBER;
        hash = (53 * hash) + getValsList().hashCode();
      }
      if (hasInfo()) {
        hash = (37 * hash) + INFO_FIELD_NUMBER;
        hash = (53 * hash) + getInfo().hashCode();
      }
      if (getRefsCount() > 0) {
        hash = (37 * hash) + REFS_FIELD_NUMBER;
        hash = (53 * hash) + getRefsList().hashCode();
      }
      if (getLatCount() > 0) {
        hash = (37 * hash) + LAT_FIELD_NUMBER;
        hash = (53 * hash) + getLatList().hashCode();
      }
      if (getLonCount() > 0) {
        hash = (37 * hash) + LON_FIELD_NUMBER;
        hash = (53 * hash) + getLonList().hashCode();
      }
      hash = (29 * hash) + unknownFields.hashCode();
      memoizedHashCode = hash;
      return hash;
    }

    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Way parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Way parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Way parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Way parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Way parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Way parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Way parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Way parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Way parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Way parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Way parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Way parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @java.lang.Override
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }
    public static Builder newBuilder(org.openstreetmap.osmosis.osmbinary.Osmformat.Way prototype) {
      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
    }
    @java.lang.Override
    public Builder toBuilder() {
      return this == DEFAULT_INSTANCE
          ? new Builder() : new Builder().mergeFrom(this);
    }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code OSMPBF.Way}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:OSMPBF.Way)
        org.openstreetmap.osmosis.osmbinary.Osmformat.WayOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_Way_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_Way_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.openstreetmap.osmosis.osmbinary.Osmformat.Way.class, org.openstreetmap.osmosis.osmbinary.Osmformat.Way.Builder.class);
      }

      // Construct using org.openstreetmap.osmosis.osmbinary.Osmformat.Way.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
          getInfoFieldBuilder();
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        id_ = 0L;
        bitField0_ = (bitField0_ & ~0x00000001);
        keys_ = emptyIntList();
        bitField0_ = (bitField0_ & ~0x00000002);
        vals_ = emptyIntList();
        bitField0_ = (bitField0_ & ~0x00000004);
        if (infoBuilder_ == null) {
          info_ = null;
        } else {
          infoBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000008);
        refs_ = emptyLongList();
        bitField0_ = (bitField0_ & ~0x00000010);
        lat_ = emptyLongList();
        bitField0_ = (bitField0_ & ~0x00000020);
        lon_ = emptyLongList();
        bitField0_ = (bitField0_ & ~0x00000040);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_Way_descriptor;
      }

      @java.lang.Override
      public org.openstreetmap.osmosis.osmbinary.Osmformat.Way getDefaultInstanceForType() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.Way.getDefaultInstance();
      }

      @java.lang.Override
      public org.openstreetmap.osmosis.osmbinary.Osmformat.Way build() {
        org.openstreetmap.osmosis.osmbinary.Osmformat.Way result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public org.openstreetmap.osmosis.osmbinary.Osmformat.Way buildPartial() {
        org.openstreetmap.osmosis.osmbinary.Osmformat.Way result = new org.openstreetmap.osmosis.osmbinary.Osmformat.Way(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          result.id_ = id_;
          to_bitField0_ |= 0x00000001;
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          keys_.makeImmutable();
          bitField0_ = (bitField0_ & ~0x00000002);
        }
        result.keys_ = keys_;
        if (((bitField0_ & 0x00000004) != 0)) {
          vals_.makeImmutable();
          bitField0_ = (bitField0_ & ~0x00000004);
        }
        result.vals_ = vals_;
        if (((from_bitField0_ & 0x00000008) != 0)) {
          if (infoBuilder_ == null) {
            result.info_ = info_;
          } else {
            result.info_ = infoBuilder_.build();
          }
          to_bitField0_ |= 0x00000002;
        }
        if (((bitField0_ & 0x00000010) != 0)) {
          refs_.makeImmutable();
          bitField0_ = (bitField0_ & ~0x00000010);
        }
        result.refs_ = refs_;
        if (((bitField0_ & 0x00000020) != 0)) {
          lat_.makeImmutable();
          bitField0_ = (bitField0_ & ~0x00000020);
        }
        result.lat_ = lat_;
        if (((bitField0_ & 0x00000040) != 0)) {
          lon_.makeImmutable();
          bitField0_ = (bitField0_ & ~0x00000040);
        }
        result.lon_ = lon_;
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      @java.lang.Override
      public Builder clone() {
        return super.clone();
      }
      @java.lang.Override
      public Builder setField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.setField(field, value);
      }
      @java.lang.Override
      public Builder clearField(
          com.google.protobuf.Descriptors.FieldDescriptor field) {
        return super.clearField(field);
      }
      @java.lang.Override
      public Builder clearOneof(
          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
        return super.clearOneof(oneof);
      }
      @java.lang.Override
      public Builder setRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          int index, java.lang.Object value) {
        return super.setRepeatedField(field, index, value);
      }
      @java.lang.Override
      public Builder addRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.addRepeatedField(field, value);
      }
      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof org.openstreetmap.osmosis.osmbinary.Osmformat.Way) {
          return mergeFrom((org.openstreetmap.osmosis.osmbinary.Osmformat.Way)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(org.openstreetmap.osmosis.osmbinary.Osmformat.Way other) {
        if (other == org.openstreetmap.osmosis.osmbinary.Osmformat.Way.getDefaultInstance()) return this;
        if (other.hasId()) {
          setId(other.getId());
        }
        if (!other.keys_.isEmpty()) {
          if (keys_.isEmpty()) {
            keys_ = other.keys_;
            bitField0_ = (bitField0_ & ~0x00000002);
          } else {
            ensureKeysIsMutable();
            keys_.addAll(other.keys_);
          }
          onChanged();
        }
        if (!other.vals_.isEmpty()) {
          if (vals_.isEmpty()) {
            vals_ = other.vals_;
            bitField0_ = (bitField0_ & ~0x00000004);
          } else {
            ensureValsIsMutable();
            vals_.addAll(other.vals_);
          }
          onChanged();
        }
        if (other.hasInfo()) {
          mergeInfo(other.getInfo());
        }
        if (!other.refs_.isEmpty()) {
          if (refs_.isEmpty()) {
            refs_ = other.refs_;
            bitField0_ = (bitField0_ & ~0x00000010);
          } else {
            ensureRefsIsMutable();
            refs_.addAll(other.refs_);
          }
          onChanged();
        }
        if (!other.lat_.isEmpty()) {
          if (lat_.isEmpty()) {
            lat_ = other.lat_;
            bitField0_ = (bitField0_ & ~0x00000020);
          } else {
            ensureLatIsMutable();
            lat_.addAll(other.lat_);
          }
          onChanged();
        }
        if (!other.lon_.isEmpty()) {
          if (lon_.isEmpty()) {
            lon_ = other.lon_;
            bitField0_ = (bitField0_ & ~0x00000040);
          } else {
            ensureLonIsMutable();
            lon_.addAll(other.lon_);
          }
          onChanged();
        }
        this.mergeUnknownFields(other.unknownFields);
        onChanged();
        return this;
      }

      @java.lang.Override
      public final boolean isInitialized() {
        if (!hasId()) {
          return false;
        }
        return true;
      }

      @java.lang.Override
      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        org.openstreetmap.osmosis.osmbinary.Osmformat.Way parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (org.openstreetmap.osmosis.osmbinary.Osmformat.Way) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      private long id_ ;
      /**
       * <code>required int64 id = 1;</code>
       * @return Whether the id field is set.
       */
      @java.lang.Override
      public boolean hasId() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <code>required int64 id = 1;</code>
       * @return The id.
       */
      @java.lang.Override
      public long getId() {
        return id_;
      }
      /**
       * <code>required int64 id = 1;</code>
       * @param value The id to set.
       * @return This builder for chaining.
       */
      public Builder setId(long value) {
        bitField0_ |= 0x00000001;
        id_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>required int64 id = 1;</code>
       * @return This builder for chaining.
       */
      public Builder clearId() {
        bitField0_ = (bitField0_ & ~0x00000001);
        id_ = 0L;
        onChanged();
        return this;
      }

      private com.google.protobuf.Internal.IntList keys_ = emptyIntList();
      private void ensureKeysIsMutable() {
        if (!((bitField0_ & 0x00000002) != 0)) {
          keys_ = mutableCopy(keys_);
          bitField0_ |= 0x00000002;
         }
      }
      /**
       * <pre>
       * Parallel arrays.
       * </pre>
       *
       * <code>repeated uint32 keys = 2 [packed = true];</code>
       * @return A list containing the keys.
       */
      public java.util.List<java.lang.Integer>
          getKeysList() {
        return ((bitField0_ & 0x00000002) != 0) ?
                 java.util.Collections.unmodifiableList(keys_) : keys_;
      }
      /**
       * <pre>
       * Parallel arrays.
       * </pre>
       *
       * <code>repeated uint32 keys = 2 [packed = true];</code>
       * @return The count of keys.
       */
      public int getKeysCount() {
        return keys_.size();
      }
      /**
       * <pre>
       * Parallel arrays.
       * </pre>
       *
       * <code>repeated uint32 keys = 2 [packed = true];</code>
       * @param index The index of the element to return.
       * @return The keys at the given index.
       */
      public int getKeys(int index) {
        return keys_.getInt(index);
      }
      /**
       * <pre>
       * Parallel arrays.
       * </pre>
       *
       * <code>repeated uint32 keys = 2 [packed = true];</code>
       * @param index The index to set the value at.
       * @param value The keys to set.
       * @return This builder for chaining.
       */
      public Builder setKeys(
          int index, int value) {
        ensureKeysIsMutable();
        keys_.setInt(index, value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Parallel arrays.
       * </pre>
       *
       * <code>repeated uint32 keys = 2 [packed = true];</code>
       * @param value The keys to add.
       * @return This builder for chaining.
       */
      public Builder addKeys(int value) {
        ensureKeysIsMutable();
        keys_.addInt(value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Parallel arrays.
       * </pre>
       *
       * <code>repeated uint32 keys = 2 [packed = true];</code>
       * @param values The keys to add.
       * @return This builder for chaining.
       */
      public Builder addAllKeys(
          java.lang.Iterable<? extends java.lang.Integer> values) {
        ensureKeysIsMutable();
        com.google.protobuf.AbstractMessageLite.Builder.addAll(
            values, keys_);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Parallel arrays.
       * </pre>
       *
       * <code>repeated uint32 keys = 2 [packed = true];</code>
       * @return This builder for chaining.
       */
      public Builder clearKeys() {
        keys_ = emptyIntList();
        bitField0_ = (bitField0_ & ~0x00000002);
        onChanged();
        return this;
      }

      private com.google.protobuf.Internal.IntList vals_ = emptyIntList();
      private void ensureValsIsMutable() {
        if (!((bitField0_ & 0x00000004) != 0)) {
          vals_ = mutableCopy(vals_);
          bitField0_ |= 0x00000004;
         }
      }
      /**
       * <code>repeated uint32 vals = 3 [packed = true];</code>
       * @return A list containing the vals.
       */
      public java.util.List<java.lang.Integer>
          getValsList() {
        return ((bitField0_ & 0x00000004) != 0) ?
                 java.util.Collections.unmodifiableList(vals_) : vals_;
      }
      /**
       * <code>repeated uint32 vals = 3 [packed = true];</code>
       * @return The count of vals.
       */
      public int getValsCount() {
        return vals_.size();
      }
      /**
       * <code>repeated uint32 vals = 3 [packed = true];</code>
       * @param index The index of the element to return.
       * @return The vals at the given index.
       */
      public int getVals(int index) {
        return vals_.getInt(index);
      }
      /**
       * <code>repeated uint32 vals = 3 [packed = true];</code>
       * @param index The index to set the value at.
       * @param value The vals to set.
       * @return This builder for chaining.
       */
      public Builder setVals(
          int index, int value) {
        ensureValsIsMutable();
        vals_.setInt(index, value);
        onChanged();
        return this;
      }
      /**
       * <code>repeated uint32 vals = 3 [packed = true];</code>
       * @param value The vals to add.
       * @return This builder for chaining.
       */
      public Builder addVals(int value) {
        ensureValsIsMutable();
        vals_.addInt(value);
        onChanged();
        return this;
      }
      /**
       * <code>repeated uint32 vals = 3 [packed = true];</code>
       * @param values The vals to add.
       * @return This builder for chaining.
       */
      public Builder addAllVals(
          java.lang.Iterable<? extends java.lang.Integer> values) {
        ensureValsIsMutable();
        com.google.protobuf.AbstractMessageLite.Builder.addAll(
            values, vals_);
        onChanged();
        return this;
      }
      /**
       * <code>repeated uint32 vals = 3 [packed = true];</code>
       * @return This builder for chaining.
       */
      public Builder clearVals() {
        vals_ = emptyIntList();
        bitField0_ = (bitField0_ & ~0x00000004);
        onChanged();
        return this;
      }

      private org.openstreetmap.osmosis.osmbinary.Osmformat.Info info_;
      private com.google.protobuf.SingleFieldBuilderV3<
          org.openstreetmap.osmosis.osmbinary.Osmformat.Info, org.openstreetmap.osmosis.osmbinary.Osmformat.Info.Builder, org.openstreetmap.osmosis.osmbinary.Osmformat.InfoOrBuilder> infoBuilder_;
      /**
       * <code>optional .OSMPBF.Info info = 4;</code>
       * @return Whether the info field is set.
       */
      public boolean hasInfo() {
        return ((bitField0_ & 0x00000008) != 0);
      }
      /**
       * <code>optional .OSMPBF.Info info = 4;</code>
       * @return The info.
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.Info getInfo() {
        if (infoBuilder_ == null) {
          return info_ == null ? org.openstreetmap.osmosis.osmbinary.Osmformat.Info.getDefaultInstance() : info_;
        } else {
          return infoBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .OSMPBF.Info info = 4;</code>
       */
      public Builder setInfo(org.openstreetmap.osmosis.osmbinary.Osmformat.Info value) {
        if (infoBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          info_ = value;
          onChanged();
        } else {
          infoBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000008;
        return this;
      }
      /**
       * <code>optional .OSMPBF.Info info = 4;</code>
       */
      public Builder setInfo(
          org.openstreetmap.osmosis.osmbinary.Osmformat.Info.Builder builderForValue) {
        if (infoBuilder_ == null) {
          info_ = builderForValue.build();
          onChanged();
        } else {
          infoBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000008;
        return this;
      }
      /**
       * <code>optional .OSMPBF.Info info = 4;</code>
       */
      public Builder mergeInfo(org.openstreetmap.osmosis.osmbinary.Osmformat.Info value) {
        if (infoBuilder_ == null) {
          if (((bitField0_ & 0x00000008) != 0) &&
              info_ != null &&
              info_ != org.openstreetmap.osmosis.osmbinary.Osmformat.Info.getDefaultInstance()) {
            info_ =
              org.openstreetmap.osmosis.osmbinary.Osmformat.Info.newBuilder(info_).mergeFrom(value).buildPartial();
          } else {
            info_ = value;
          }
          onChanged();
        } else {
          infoBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000008;
        return this;
      }
      /**
       * <code>optional .OSMPBF.Info info = 4;</code>
       */
      public Builder clearInfo() {
        if (infoBuilder_ == null) {
          info_ = null;
          onChanged();
        } else {
          infoBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000008);
        return this;
      }
      /**
       * <code>optional .OSMPBF.Info info = 4;</code>
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.Info.Builder getInfoBuilder() {
        bitField0_ |= 0x00000008;
        onChanged();
        return getInfoFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .OSMPBF.Info info = 4;</code>
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.InfoOrBuilder getInfoOrBuilder() {
        if (infoBuilder_ != null) {
          return infoBuilder_.getMessageOrBuilder();
        } else {
          return info_ == null ?
              org.openstreetmap.osmosis.osmbinary.Osmformat.Info.getDefaultInstance() : info_;
        }
      }
      /**
       * <code>optional .OSMPBF.Info info = 4;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          org.openstreetmap.osmosis.osmbinary.Osmformat.Info, org.openstreetmap.osmosis.osmbinary.Osmformat.Info.Builder, org.openstreetmap.osmosis.osmbinary.Osmformat.InfoOrBuilder> 
          getInfoFieldBuilder() {
        if (infoBuilder_ == null) {
          infoBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              org.openstreetmap.osmosis.osmbinary.Osmformat.Info, org.openstreetmap.osmosis.osmbinary.Osmformat.Info.Builder, org.openstreetmap.osmosis.osmbinary.Osmformat.InfoOrBuilder>(
                  getInfo(),
                  getParentForChildren(),
                  isClean());
          info_ = null;
        }
        return infoBuilder_;
      }

      private com.google.protobuf.Internal.LongList refs_ = emptyLongList();
      private void ensureRefsIsMutable() {
        if (!((bitField0_ & 0x00000010) != 0)) {
          refs_ = mutableCopy(refs_);
          bitField0_ |= 0x00000010;
         }
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint64 refs = 8 [packed = true];</code>
       * @return A list containing the refs.
       */
      public java.util.List<java.lang.Long>
          getRefsList() {
        return ((bitField0_ & 0x00000010) != 0) ?
                 java.util.Collections.unmodifiableList(refs_) : refs_;
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint64 refs = 8 [packed = true];</code>
       * @return The count of refs.
       */
      public int getRefsCount() {
        return refs_.size();
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint64 refs = 8 [packed = true];</code>
       * @param index The index of the element to return.
       * @return The refs at the given index.
       */
      public long getRefs(int index) {
        return refs_.getLong(index);
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint64 refs = 8 [packed = true];</code>
       * @param index The index to set the value at.
       * @param value The refs to set.
       * @return This builder for chaining.
       */
      public Builder setRefs(
          int index, long value) {
        ensureRefsIsMutable();
        refs_.setLong(index, value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint64 refs = 8 [packed = true];</code>
       * @param value The refs to add.
       * @return This builder for chaining.
       */
      public Builder addRefs(long value) {
        ensureRefsIsMutable();
        refs_.addLong(value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint64 refs = 8 [packed = true];</code>
       * @param values The refs to add.
       * @return This builder for chaining.
       */
      public Builder addAllRefs(
          java.lang.Iterable<? extends java.lang.Long> values) {
        ensureRefsIsMutable();
        com.google.protobuf.AbstractMessageLite.Builder.addAll(
            values, refs_);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * DELTA coded
       * </pre>
       *
       * <code>repeated sint64 refs = 8 [packed = true];</code>
       * @return This builder for chaining.
       */
      public Builder clearRefs() {
        refs_ = emptyLongList();
        bitField0_ = (bitField0_ & ~0x00000010);
        onChanged();
        return this;
      }

      private com.google.protobuf.Internal.LongList lat_ = emptyLongList();
      private void ensureLatIsMutable() {
        if (!((bitField0_ & 0x00000020) != 0)) {
          lat_ = mutableCopy(lat_);
          bitField0_ |= 0x00000020;
         }
      }
      /**
       * <code>repeated sint64 lat = 9 [packed = true];</code>
       * @return A list containing the lat.
       */
      public java.util.List<java.lang.Long>
          getLatList() {
        return ((bitField0_ & 0x00000020) != 0) ?
                 java.util.Collections.unmodifiableList(lat_) : lat_;
      }
      /**
       * <code>repeated sint64 lat = 9 [packed = true];</code>
       * @return The count of lat.
       */
      public int getLatCount() {
        return lat_.size();
      }
      /**
       * <code>repeated sint64 lat = 9 [packed = true];</code>
       * @param index The index of the element to return.
       * @return The lat at the given index.
       */
      public long getLat(int index) {
        return lat_.getLong(index);
      }
      /**
       * <code>repeated sint64 lat = 9 [packed = true];</code>
       * @param index The index to set the value at.
       * @param value The lat to set.
       * @return This builder for chaining.
       */
      public Builder setLat(
          int index, long value) {
        ensureLatIsMutable();
        lat_.setLong(index, value);
        onChanged();
        return this;
      }
      /**
       * <code>repeated sint64 lat = 9 [packed = true];</code>
       * @param value The lat to add.
       * @return This builder for chaining.
       */
      public Builder addLat(long value) {
        ensureLatIsMutable();
        lat_.addLong(value);
        onChanged();
        return this;
      }
      /**
       * <code>repeated sint64 lat = 9 [packed = true];</code>
       * @param values The lat to add.
       * @return This builder for chaining.
       */
      public Builder addAllLat(
          java.lang.Iterable<? extends java.lang.Long> values) {
        ensureLatIsMutable();
        com.google.protobuf.AbstractMessageLite.Builder.addAll(
            values, lat_);
        onChanged();
        return this;
      }
      /**
       * <code>repeated sint64 lat = 9 [packed = true];</code>
       * @return This builder for chaining.
       */
      public Builder clearLat() {
        lat_ = emptyLongList();
        bitField0_ = (bitField0_ & ~0x00000020);
        onChanged();
        return this;
      }

      private com.google.protobuf.Internal.LongList lon_ = emptyLongList();
      private void ensureLonIsMutable() {
        if (!((bitField0_ & 0x00000040) != 0)) {
          lon_ = mutableCopy(lon_);
          bitField0_ |= 0x00000040;
         }
      }
      /**
       * <code>repeated sint64 lon = 10 [packed = true];</code>
       * @return A list containing the lon.
       */
      public java.util.List<java.lang.Long>
          getLonList() {
        return ((bitField0_ & 0x00000040) != 0) ?
                 java.util.Collections.unmodifiableList(lon_) : lon_;
      }
      /**
       * <code>repeated sint64 lon = 10 [packed = true];</code>
       * @return The count of lon.
       */
      public int getLonCount() {
        return lon_.size();
      }
      /**
       * <code>repeated sint64 lon = 10 [packed = true];</code>
       * @param index The index of the element to return.
       * @return The lon at the given index.
       */
      public long getLon(int index) {
        return lon_.getLong(index);
      }
      /**
       * <code>repeated sint64 lon = 10 [packed = true];</code>
       * @param index The index to set the value at.
       * @param value The lon to set.
       * @return This builder for chaining.
       */
      public Builder setLon(
          int index, long value) {
        ensureLonIsMutable();
        lon_.setLong(index, value);
        onChanged();
        return this;
      }
      /**
       * <code>repeated sint64 lon = 10 [packed = true];</code>
       * @param value The lon to add.
       * @return This builder for chaining.
       */
      public Builder addLon(long value) {
        ensureLonIsMutable();
        lon_.addLong(value);
        onChanged();
        return this;
      }
      /**
       * <code>repeated sint64 lon = 10 [packed = true];</code>
       * @param values The lon to add.
       * @return This builder for chaining.
       */
      public Builder addAllLon(
          java.lang.Iterable<? extends java.lang.Long> values) {
        ensureLonIsMutable();
        com.google.protobuf.AbstractMessageLite.Builder.addAll(
            values, lon_);
        onChanged();
        return this;
      }
      /**
       * <code>repeated sint64 lon = 10 [packed = true];</code>
       * @return This builder for chaining.
       */
      public Builder clearLon() {
        lon_ = emptyLongList();
        bitField0_ = (bitField0_ & ~0x00000040);
        onChanged();
        return this;
      }
      @java.lang.Override
      public final Builder setUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.setUnknownFields(unknownFields);
      }

      @java.lang.Override
      public final Builder mergeUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.mergeUnknownFields(unknownFields);
      }


      // @@protoc_insertion_point(builder_scope:OSMPBF.Way)
    }

    // @@protoc_insertion_point(class_scope:OSMPBF.Way)
    private static final org.openstreetmap.osmosis.osmbinary.Osmformat.Way DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new org.openstreetmap.osmosis.osmbinary.Osmformat.Way();
    }

    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Way getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    @java.lang.Deprecated public static final com.google.protobuf.Parser<Way>
        PARSER = new com.google.protobuf.AbstractParser<Way>() {
      @java.lang.Override
      public Way parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new Way(input, extensionRegistry);
      }
    };

    public static com.google.protobuf.Parser<Way> parser() {
      return PARSER;
    }

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

    @java.lang.Override
    public org.openstreetmap.osmosis.osmbinary.Osmformat.Way getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface RelationOrBuilder extends
      // @@protoc_insertion_point(interface_extends:OSMPBF.Relation)
      com.google.protobuf.MessageOrBuilder {

    /**
     * <code>required int64 id = 1;</code>
     * @return Whether the id field is set.
     */
    boolean hasId();
    /**
     * <code>required int64 id = 1;</code>
     * @return The id.
     */
    long getId();

    /**
     * <pre>
     * Parallel arrays.
     * </pre>
     *
     * <code>repeated uint32 keys = 2 [packed = true];</code>
     * @return A list containing the keys.
     */
    java.util.List<java.lang.Integer> getKeysList();
    /**
     * <pre>
     * Parallel arrays.
     * </pre>
     *
     * <code>repeated uint32 keys = 2 [packed = true];</code>
     * @return The count of keys.
     */
    int getKeysCount();
    /**
     * <pre>
     * Parallel arrays.
     * </pre>
     *
     * <code>repeated uint32 keys = 2 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The keys at the given index.
     */
    int getKeys(int index);

    /**
     * <code>repeated uint32 vals = 3 [packed = true];</code>
     * @return A list containing the vals.
     */
    java.util.List<java.lang.Integer> getValsList();
    /**
     * <code>repeated uint32 vals = 3 [packed = true];</code>
     * @return The count of vals.
     */
    int getValsCount();
    /**
     * <code>repeated uint32 vals = 3 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The vals at the given index.
     */
    int getVals(int index);

    /**
     * <code>optional .OSMPBF.Info info = 4;</code>
     * @return Whether the info field is set.
     */
    boolean hasInfo();
    /**
     * <code>optional .OSMPBF.Info info = 4;</code>
     * @return The info.
     */
    org.openstreetmap.osmosis.osmbinary.Osmformat.Info getInfo();
    /**
     * <code>optional .OSMPBF.Info info = 4;</code>
     */
    org.openstreetmap.osmosis.osmbinary.Osmformat.InfoOrBuilder getInfoOrBuilder();

    /**
     * <pre>
     * Parallel arrays
     * </pre>
     *
     * <code>repeated int32 roles_sid = 8 [packed = true];</code>
     * @return A list containing the rolesSid.
     */
    java.util.List<java.lang.Integer> getRolesSidList();
    /**
     * <pre>
     * Parallel arrays
     * </pre>
     *
     * <code>repeated int32 roles_sid = 8 [packed = true];</code>
     * @return The count of rolesSid.
     */
    int getRolesSidCount();
    /**
     * <pre>
     * Parallel arrays
     * </pre>
     *
     * <code>repeated int32 roles_sid = 8 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The rolesSid at the given index.
     */
    int getRolesSid(int index);

    /**
     * <pre>
     * DELTA encoded
     * </pre>
     *
     * <code>repeated sint64 memids = 9 [packed = true];</code>
     * @return A list containing the memids.
     */
    java.util.List<java.lang.Long> getMemidsList();
    /**
     * <pre>
     * DELTA encoded
     * </pre>
     *
     * <code>repeated sint64 memids = 9 [packed = true];</code>
     * @return The count of memids.
     */
    int getMemidsCount();
    /**
     * <pre>
     * DELTA encoded
     * </pre>
     *
     * <code>repeated sint64 memids = 9 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The memids at the given index.
     */
    long getMemids(int index);

    /**
     * <code>repeated .OSMPBF.Relation.MemberType types = 10 [packed = true];</code>
     * @return A list containing the types.
     */
    java.util.List<org.openstreetmap.osmosis.osmbinary.Osmformat.Relation.MemberType> getTypesList();
    /**
     * <code>repeated .OSMPBF.Relation.MemberType types = 10 [packed = true];</code>
     * @return The count of types.
     */
    int getTypesCount();
    /**
     * <code>repeated .OSMPBF.Relation.MemberType types = 10 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The types at the given index.
     */
    org.openstreetmap.osmosis.osmbinary.Osmformat.Relation.MemberType getTypes(int index);
  }
  /**
   * Protobuf type {@code OSMPBF.Relation}
   */
  public static final class Relation extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:OSMPBF.Relation)
      RelationOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use Relation.newBuilder() to construct.
    private Relation(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
      super(builder);
    }
    private Relation() {
      keys_ = emptyIntList();
      vals_ = emptyIntList();
      rolesSid_ = emptyIntList();
      memids_ = emptyLongList();
      types_ = java.util.Collections.emptyList();
    }

    @java.lang.Override
    @SuppressWarnings({"unused"})
    protected java.lang.Object newInstance(
        UnusedPrivateParameter unused) {
      return new Relation();
    }

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    private Relation(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      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;
            case 8: {
              bitField0_ |= 0x00000001;
              id_ = input.readInt64();
              break;
            }
            case 16: {
              if (!((mutable_bitField0_ & 0x00000002) != 0)) {
                keys_ = newIntList();
                mutable_bitField0_ |= 0x00000002;
              }
              keys_.addInt(input.readUInt32());
              break;
            }
            case 18: {
              int length = input.readRawVarint32();
              int limit = input.pushLimit(length);
              if (!((mutable_bitField0_ & 0x00000002) != 0) && input.getBytesUntilLimit() > 0) {
                keys_ = newIntList();
                mutable_bitField0_ |= 0x00000002;
              }
              while (input.getBytesUntilLimit() > 0) {
                keys_.addInt(input.readUInt32());
              }
              input.popLimit(limit);
              break;
            }
            case 24: {
              if (!((mutable_bitField0_ & 0x00000004) != 0)) {
                vals_ = newIntList();
                mutable_bitField0_ |= 0x00000004;
              }
              vals_.addInt(input.readUInt32());
              break;
            }
            case 26: {
              int length = input.readRawVarint32();
              int limit = input.pushLimit(length);
              if (!((mutable_bitField0_ & 0x00000004) != 0) && input.getBytesUntilLimit() > 0) {
                vals_ = newIntList();
                mutable_bitField0_ |= 0x00000004;
              }
              while (input.getBytesUntilLimit() > 0) {
                vals_.addInt(input.readUInt32());
              }
              input.popLimit(limit);
              break;
            }
            case 34: {
              org.openstreetmap.osmosis.osmbinary.Osmformat.Info.Builder subBuilder = null;
              if (((bitField0_ & 0x00000002) != 0)) {
                subBuilder = info_.toBuilder();
              }
              info_ = input.readMessage(org.openstreetmap.osmosis.osmbinary.Osmformat.Info.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(info_);
                info_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000002;
              break;
            }
            case 64: {
              if (!((mutable_bitField0_ & 0x00000010) != 0)) {
                rolesSid_ = newIntList();
                mutable_bitField0_ |= 0x00000010;
              }
              rolesSid_.addInt(input.readInt32());
              break;
            }
            case 66: {
              int length = input.readRawVarint32();
              int limit = input.pushLimit(length);
              if (!((mutable_bitField0_ & 0x00000010) != 0) && input.getBytesUntilLimit() > 0) {
                rolesSid_ = newIntList();
                mutable_bitField0_ |= 0x00000010;
              }
              while (input.getBytesUntilLimit() > 0) {
                rolesSid_.addInt(input.readInt32());
              }
              input.popLimit(limit);
              break;
            }
            case 72: {
              if (!((mutable_bitField0_ & 0x00000020) != 0)) {
                memids_ = newLongList();
                mutable_bitField0_ |= 0x00000020;
              }
              memids_.addLong(input.readSInt64());
              break;
            }
            case 74: {
              int length = input.readRawVarint32();
              int limit = input.pushLimit(length);
              if (!((mutable_bitField0_ & 0x00000020) != 0) && input.getBytesUntilLimit() > 0) {
                memids_ = newLongList();
                mutable_bitField0_ |= 0x00000020;
              }
              while (input.getBytesUntilLimit() > 0) {
                memids_.addLong(input.readSInt64());
              }
              input.popLimit(limit);
              break;
            }
            case 80: {
              int rawValue = input.readEnum();
              @SuppressWarnings("deprecation")
              org.openstreetmap.osmosis.osmbinary.Osmformat.Relation.MemberType value = org.openstreetmap.osmosis.osmbinary.Osmformat.Relation.MemberType.valueOf(rawValue);
              if (value == null) {
                unknownFields.mergeVarintField(10, rawValue);
              } else {
                if (!((mutable_bitField0_ & 0x00000040) != 0)) {
                  types_ = new java.util.ArrayList<java.lang.Integer>();
                  mutable_bitField0_ |= 0x00000040;
                }
                types_.add(rawValue);
              }
              break;
            }
            case 82: {
              int length = input.readRawVarint32();
              int oldLimit = input.pushLimit(length);
              while(input.getBytesUntilLimit() > 0) {
                int rawValue = input.readEnum();
                @SuppressWarnings("deprecation")
                org.openstreetmap.osmosis.osmbinary.Osmformat.Relation.MemberType value = org.openstreetmap.osmosis.osmbinary.Osmformat.Relation.MemberType.valueOf(rawValue);
                if (value == null) {
                  unknownFields.mergeVarintField(10, rawValue);
                } else {
                  if (!((mutable_bitField0_ & 0x00000040) != 0)) {
                    types_ = new java.util.ArrayList<java.lang.Integer>();
                    mutable_bitField0_ |= 0x00000040;
                  }
                  types_.add(rawValue);
                }
              }
              input.popLimit(oldLimit);
              break;
            }
            default: {
              if (!parseUnknownField(
                  input, unknownFields, extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e).setUnfinishedMessage(this);
      } finally {
        if (((mutable_bitField0_ & 0x00000002) != 0)) {
          keys_.makeImmutable(); // C
        }
        if (((mutable_bitField0_ & 0x00000004) != 0)) {
          vals_.makeImmutable(); // C
        }
        if (((mutable_bitField0_ & 0x00000010) != 0)) {
          rolesSid_.makeImmutable(); // C
        }
        if (((mutable_bitField0_ & 0x00000020) != 0)) {
          memids_.makeImmutable(); // C
        }
        if (((mutable_bitField0_ & 0x00000040) != 0)) {
          types_ = java.util.Collections.unmodifiableList(types_);
        }
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_Relation_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_Relation_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              org.openstreetmap.osmosis.osmbinary.Osmformat.Relation.class, org.openstreetmap.osmosis.osmbinary.Osmformat.Relation.Builder.class);
    }

    /**
     * Protobuf enum {@code OSMPBF.Relation.MemberType}
     */
    public enum MemberType
        implements com.google.protobuf.ProtocolMessageEnum {
      /**
       * <code>NODE = 0;</code>
       */
      NODE(0),
      /**
       * <code>WAY = 1;</code>
       */
      WAY(1),
      /**
       * <code>RELATION = 2;</code>
       */
      RELATION(2),
      ;

      /**
       * <code>NODE = 0;</code>
       */
      public static final int NODE_VALUE = 0;
      /**
       * <code>WAY = 1;</code>
       */
      public static final int WAY_VALUE = 1;
      /**
       * <code>RELATION = 2;</code>
       */
      public static final int RELATION_VALUE = 2;


      public final int getNumber() {
        return value;
      }

      /**
       * @param value The numeric wire value of the corresponding enum entry.
       * @return The enum associated with the given numeric wire value.
       * @deprecated Use {@link #forNumber(int)} instead.
       */
      @java.lang.Deprecated
      public static MemberType valueOf(int value) {
        return forNumber(value);
      }

      /**
       * @param value The numeric wire value of the corresponding enum entry.
       * @return The enum associated with the given numeric wire value.
       */
      public static MemberType forNumber(int value) {
        switch (value) {
          case 0: return NODE;
          case 1: return WAY;
          case 2: return RELATION;
          default: return null;
        }
      }

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

      public final com.google.protobuf.Descriptors.EnumValueDescriptor
          getValueDescriptor() {
        return getDescriptor().getValues().get(ordinal());
      }
      public final com.google.protobuf.Descriptors.EnumDescriptor
          getDescriptorForType() {
        return getDescriptor();
      }
      public static final com.google.protobuf.Descriptors.EnumDescriptor
          getDescriptor() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.Relation.getDescriptor().getEnumTypes().get(0);
      }

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

      public static MemberType valueOf(
          com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
        if (desc.getType() != getDescriptor()) {
          throw new java.lang.IllegalArgumentException(
            "EnumValueDescriptor is not for this type.");
        }
        return VALUES[desc.getIndex()];
      }

      private final int value;

      private MemberType(int value) {
        this.value = value;
      }

      // @@protoc_insertion_point(enum_scope:OSMPBF.Relation.MemberType)
    }

    private int bitField0_;
    public static final int ID_FIELD_NUMBER = 1;
    private long id_;
    /**
     * <code>required int64 id = 1;</code>
     * @return Whether the id field is set.
     */
    @java.lang.Override
    public boolean hasId() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <code>required int64 id = 1;</code>
     * @return The id.
     */
    @java.lang.Override
    public long getId() {
      return id_;
    }

    public static final int KEYS_FIELD_NUMBER = 2;
    private com.google.protobuf.Internal.IntList keys_;
    /**
     * <pre>
     * Parallel arrays.
     * </pre>
     *
     * <code>repeated uint32 keys = 2 [packed = true];</code>
     * @return A list containing the keys.
     */
    @java.lang.Override
    public java.util.List<java.lang.Integer>
        getKeysList() {
      return keys_;
    }
    /**
     * <pre>
     * Parallel arrays.
     * </pre>
     *
     * <code>repeated uint32 keys = 2 [packed = true];</code>
     * @return The count of keys.
     */
    public int getKeysCount() {
      return keys_.size();
    }
    /**
     * <pre>
     * Parallel arrays.
     * </pre>
     *
     * <code>repeated uint32 keys = 2 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The keys at the given index.
     */
    public int getKeys(int index) {
      return keys_.getInt(index);
    }
    private int keysMemoizedSerializedSize = -1;

    public static final int VALS_FIELD_NUMBER = 3;
    private com.google.protobuf.Internal.IntList vals_;
    /**
     * <code>repeated uint32 vals = 3 [packed = true];</code>
     * @return A list containing the vals.
     */
    @java.lang.Override
    public java.util.List<java.lang.Integer>
        getValsList() {
      return vals_;
    }
    /**
     * <code>repeated uint32 vals = 3 [packed = true];</code>
     * @return The count of vals.
     */
    public int getValsCount() {
      return vals_.size();
    }
    /**
     * <code>repeated uint32 vals = 3 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The vals at the given index.
     */
    public int getVals(int index) {
      return vals_.getInt(index);
    }
    private int valsMemoizedSerializedSize = -1;

    public static final int INFO_FIELD_NUMBER = 4;
    private org.openstreetmap.osmosis.osmbinary.Osmformat.Info info_;
    /**
     * <code>optional .OSMPBF.Info info = 4;</code>
     * @return Whether the info field is set.
     */
    @java.lang.Override
    public boolean hasInfo() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <code>optional .OSMPBF.Info info = 4;</code>
     * @return The info.
     */
    @java.lang.Override
    public org.openstreetmap.osmosis.osmbinary.Osmformat.Info getInfo() {
      return info_ == null ? org.openstreetmap.osmosis.osmbinary.Osmformat.Info.getDefaultInstance() : info_;
    }
    /**
     * <code>optional .OSMPBF.Info info = 4;</code>
     */
    @java.lang.Override
    public org.openstreetmap.osmosis.osmbinary.Osmformat.InfoOrBuilder getInfoOrBuilder() {
      return info_ == null ? org.openstreetmap.osmosis.osmbinary.Osmformat.Info.getDefaultInstance() : info_;
    }

    public static final int ROLES_SID_FIELD_NUMBER = 8;
    private com.google.protobuf.Internal.IntList rolesSid_;
    /**
     * <pre>
     * Parallel arrays
     * </pre>
     *
     * <code>repeated int32 roles_sid = 8 [packed = true];</code>
     * @return A list containing the rolesSid.
     */
    @java.lang.Override
    public java.util.List<java.lang.Integer>
        getRolesSidList() {
      return rolesSid_;
    }
    /**
     * <pre>
     * Parallel arrays
     * </pre>
     *
     * <code>repeated int32 roles_sid = 8 [packed = true];</code>
     * @return The count of rolesSid.
     */
    public int getRolesSidCount() {
      return rolesSid_.size();
    }
    /**
     * <pre>
     * Parallel arrays
     * </pre>
     *
     * <code>repeated int32 roles_sid = 8 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The rolesSid at the given index.
     */
    public int getRolesSid(int index) {
      return rolesSid_.getInt(index);
    }
    private int rolesSidMemoizedSerializedSize = -1;

    public static final int MEMIDS_FIELD_NUMBER = 9;
    private com.google.protobuf.Internal.LongList memids_;
    /**
     * <pre>
     * DELTA encoded
     * </pre>
     *
     * <code>repeated sint64 memids = 9 [packed = true];</code>
     * @return A list containing the memids.
     */
    @java.lang.Override
    public java.util.List<java.lang.Long>
        getMemidsList() {
      return memids_;
    }
    /**
     * <pre>
     * DELTA encoded
     * </pre>
     *
     * <code>repeated sint64 memids = 9 [packed = true];</code>
     * @return The count of memids.
     */
    public int getMemidsCount() {
      return memids_.size();
    }
    /**
     * <pre>
     * DELTA encoded
     * </pre>
     *
     * <code>repeated sint64 memids = 9 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The memids at the given index.
     */
    public long getMemids(int index) {
      return memids_.getLong(index);
    }
    private int memidsMemoizedSerializedSize = -1;

    public static final int TYPES_FIELD_NUMBER = 10;
    private java.util.List<java.lang.Integer> types_;
    private static final com.google.protobuf.Internal.ListAdapter.Converter<
        java.lang.Integer, org.openstreetmap.osmosis.osmbinary.Osmformat.Relation.MemberType> types_converter_ =
            new com.google.protobuf.Internal.ListAdapter.Converter<
                java.lang.Integer, org.openstreetmap.osmosis.osmbinary.Osmformat.Relation.MemberType>() {
              public org.openstreetmap.osmosis.osmbinary.Osmformat.Relation.MemberType convert(java.lang.Integer from) {
                @SuppressWarnings("deprecation")
                org.openstreetmap.osmosis.osmbinary.Osmformat.Relation.MemberType result = org.openstreetmap.osmosis.osmbinary.Osmformat.Relation.MemberType.valueOf(from);
                return result == null ? org.openstreetmap.osmosis.osmbinary.Osmformat.Relation.MemberType.NODE : result;
              }
            };
    /**
     * <code>repeated .OSMPBF.Relation.MemberType types = 10 [packed = true];</code>
     * @return A list containing the types.
     */
    @java.lang.Override
    public java.util.List<org.openstreetmap.osmosis.osmbinary.Osmformat.Relation.MemberType> getTypesList() {
      return new com.google.protobuf.Internal.ListAdapter<
          java.lang.Integer, org.openstreetmap.osmosis.osmbinary.Osmformat.Relation.MemberType>(types_, types_converter_);
    }
    /**
     * <code>repeated .OSMPBF.Relation.MemberType types = 10 [packed = true];</code>
     * @return The count of types.
     */
    @java.lang.Override
    public int getTypesCount() {
      return types_.size();
    }
    /**
     * <code>repeated .OSMPBF.Relation.MemberType types = 10 [packed = true];</code>
     * @param index The index of the element to return.
     * @return The types at the given index.
     */
    @java.lang.Override
    public org.openstreetmap.osmosis.osmbinary.Osmformat.Relation.MemberType getTypes(int index) {
      return types_converter_.convert(types_.get(index));
    }
    private int typesMemoizedSerializedSize;

    private byte memoizedIsInitialized = -1;
    @java.lang.Override
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized == 1) return true;
      if (isInitialized == 0) return false;

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

    @java.lang.Override
    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      getSerializedSize();
      if (((bitField0_ & 0x00000001) != 0)) {
        output.writeInt64(1, id_);
      }
      if (getKeysList().size() > 0) {
        output.writeUInt32NoTag(18);
        output.writeUInt32NoTag(keysMemoizedSerializedSize);
      }
      for (int i = 0; i < keys_.size(); i++) {
        output.writeUInt32NoTag(keys_.getInt(i));
      }
      if (getValsList().size() > 0) {
        output.writeUInt32NoTag(26);
        output.writeUInt32NoTag(valsMemoizedSerializedSize);
      }
      for (int i = 0; i < vals_.size(); i++) {
        output.writeUInt32NoTag(vals_.getInt(i));
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        output.writeMessage(4, getInfo());
      }
      if (getRolesSidList().size() > 0) {
        output.writeUInt32NoTag(66);
        output.writeUInt32NoTag(rolesSidMemoizedSerializedSize);
      }
      for (int i = 0; i < rolesSid_.size(); i++) {
        output.writeInt32NoTag(rolesSid_.getInt(i));
      }
      if (getMemidsList().size() > 0) {
        output.writeUInt32NoTag(74);
        output.writeUInt32NoTag(memidsMemoizedSerializedSize);
      }
      for (int i = 0; i < memids_.size(); i++) {
        output.writeSInt64NoTag(memids_.getLong(i));
      }
      if (getTypesList().size() > 0) {
        output.writeUInt32NoTag(82);
        output.writeUInt32NoTag(typesMemoizedSerializedSize);
      }
      for (int i = 0; i < types_.size(); i++) {
        output.writeEnumNoTag(types_.get(i));
      }
      unknownFields.writeTo(output);
    }

    @java.lang.Override
    public int getSerializedSize() {
      int size = memoizedSize;
      if (size != -1) return size;

      size = 0;
      if (((bitField0_ & 0x00000001) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt64Size(1, id_);
      }
      {
        int dataSize = 0;
        for (int i = 0; i < keys_.size(); i++) {
          dataSize += com.google.protobuf.CodedOutputStream
            .computeUInt32SizeNoTag(keys_.getInt(i));
        }
        size += dataSize;
        if (!getKeysList().isEmpty()) {
          size += 1;
          size += com.google.protobuf.CodedOutputStream
              .computeInt32SizeNoTag(dataSize);
        }
        keysMemoizedSerializedSize = dataSize;
      }
      {
        int dataSize = 0;
        for (int i = 0; i < vals_.size(); i++) {
          dataSize += com.google.protobuf.CodedOutputStream
            .computeUInt32SizeNoTag(vals_.getInt(i));
        }
        size += dataSize;
        if (!getValsList().isEmpty()) {
          size += 1;
          size += com.google.protobuf.CodedOutputStream
              .computeInt32SizeNoTag(dataSize);
        }
        valsMemoizedSerializedSize = dataSize;
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(4, getInfo());
      }
      {
        int dataSize = 0;
        for (int i = 0; i < rolesSid_.size(); i++) {
          dataSize += com.google.protobuf.CodedOutputStream
            .computeInt32SizeNoTag(rolesSid_.getInt(i));
        }
        size += dataSize;
        if (!getRolesSidList().isEmpty()) {
          size += 1;
          size += com.google.protobuf.CodedOutputStream
              .computeInt32SizeNoTag(dataSize);
        }
        rolesSidMemoizedSerializedSize = dataSize;
      }
      {
        int dataSize = 0;
        for (int i = 0; i < memids_.size(); i++) {
          dataSize += com.google.protobuf.CodedOutputStream
            .computeSInt64SizeNoTag(memids_.getLong(i));
        }
        size += dataSize;
        if (!getMemidsList().isEmpty()) {
          size += 1;
          size += com.google.protobuf.CodedOutputStream
              .computeInt32SizeNoTag(dataSize);
        }
        memidsMemoizedSerializedSize = dataSize;
      }
      {
        int dataSize = 0;
        for (int i = 0; i < types_.size(); i++) {
          dataSize += com.google.protobuf.CodedOutputStream
            .computeEnumSizeNoTag(types_.get(i));
        }
        size += dataSize;
        if (!getTypesList().isEmpty()) {  size += 1;
          size += com.google.protobuf.CodedOutputStream
            .computeUInt32SizeNoTag(dataSize);
        }typesMemoizedSerializedSize = dataSize;
      }
      size += unknownFields.getSerializedSize();
      memoizedSize = size;
      return size;
    }

    @java.lang.Override
    public boolean equals(final java.lang.Object obj) {
      if (obj == this) {
       return true;
      }
      if (!(obj instanceof org.openstreetmap.osmosis.osmbinary.Osmformat.Relation)) {
        return super.equals(obj);
      }
      org.openstreetmap.osmosis.osmbinary.Osmformat.Relation other = (org.openstreetmap.osmosis.osmbinary.Osmformat.Relation) obj;

      if (hasId() != other.hasId()) return false;
      if (hasId()) {
        if (getId()
            != other.getId()) return false;
      }
      if (!getKeysList()
          .equals(other.getKeysList())) return false;
      if (!getValsList()
          .equals(other.getValsList())) return false;
      if (hasInfo() != other.hasInfo()) return false;
      if (hasInfo()) {
        if (!getInfo()
            .equals(other.getInfo())) return false;
      }
      if (!getRolesSidList()
          .equals(other.getRolesSidList())) return false;
      if (!getMemidsList()
          .equals(other.getMemidsList())) return false;
      if (!types_.equals(other.types_)) return false;
      if (!unknownFields.equals(other.unknownFields)) return false;
      return true;
    }

    @java.lang.Override
    public int hashCode() {
      if (memoizedHashCode != 0) {
        return memoizedHashCode;
      }
      int hash = 41;
      hash = (19 * hash) + getDescriptor().hashCode();
      if (hasId()) {
        hash = (37 * hash) + ID_FIELD_NUMBER;
        hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
            getId());
      }
      if (getKeysCount() > 0) {
        hash = (37 * hash) + KEYS_FIELD_NUMBER;
        hash = (53 * hash) + getKeysList().hashCode();
      }
      if (getValsCount() > 0) {
        hash = (37 * hash) + VALS_FIELD_NUMBER;
        hash = (53 * hash) + getValsList().hashCode();
      }
      if (hasInfo()) {
        hash = (37 * hash) + INFO_FIELD_NUMBER;
        hash = (53 * hash) + getInfo().hashCode();
      }
      if (getRolesSidCount() > 0) {
        hash = (37 * hash) + ROLES_SID_FIELD_NUMBER;
        hash = (53 * hash) + getRolesSidList().hashCode();
      }
      if (getMemidsCount() > 0) {
        hash = (37 * hash) + MEMIDS_FIELD_NUMBER;
        hash = (53 * hash) + getMemidsList().hashCode();
      }
      if (getTypesCount() > 0) {
        hash = (37 * hash) + TYPES_FIELD_NUMBER;
        hash = (53 * hash) + types_.hashCode();
      }
      hash = (29 * hash) + unknownFields.hashCode();
      memoizedHashCode = hash;
      return hash;
    }

    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Relation parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Relation parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Relation parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Relation parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Relation parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Relation parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Relation parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Relation parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Relation parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Relation parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Relation parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Relation parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input, extensionRegistry);
    }

    @java.lang.Override
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder() {
      return DEFAULT_INSTANCE.toBuilder();
    }
    public static Builder newBuilder(org.openstreetmap.osmosis.osmbinary.Osmformat.Relation prototype) {
      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
    }
    @java.lang.Override
    public Builder toBuilder() {
      return this == DEFAULT_INSTANCE
          ? new Builder() : new Builder().mergeFrom(this);
    }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code OSMPBF.Relation}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
        // @@protoc_insertion_point(builder_implements:OSMPBF.Relation)
        org.openstreetmap.osmosis.osmbinary.Osmformat.RelationOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_Relation_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_Relation_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                org.openstreetmap.osmosis.osmbinary.Osmformat.Relation.class, org.openstreetmap.osmosis.osmbinary.Osmformat.Relation.Builder.class);
      }

      // Construct using org.openstreetmap.osmosis.osmbinary.Osmformat.Relation.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
          getInfoFieldBuilder();
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        id_ = 0L;
        bitField0_ = (bitField0_ & ~0x00000001);
        keys_ = emptyIntList();
        bitField0_ = (bitField0_ & ~0x00000002);
        vals_ = emptyIntList();
        bitField0_ = (bitField0_ & ~0x00000004);
        if (infoBuilder_ == null) {
          info_ = null;
        } else {
          infoBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000008);
        rolesSid_ = emptyIntList();
        bitField0_ = (bitField0_ & ~0x00000010);
        memids_ = emptyLongList();
        bitField0_ = (bitField0_ & ~0x00000020);
        types_ = java.util.Collections.emptyList();
        bitField0_ = (bitField0_ & ~0x00000040);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.internal_static_OSMPBF_Relation_descriptor;
      }

      @java.lang.Override
      public org.openstreetmap.osmosis.osmbinary.Osmformat.Relation getDefaultInstanceForType() {
        return org.openstreetmap.osmosis.osmbinary.Osmformat.Relation.getDefaultInstance();
      }

      @java.lang.Override
      public org.openstreetmap.osmosis.osmbinary.Osmformat.Relation build() {
        org.openstreetmap.osmosis.osmbinary.Osmformat.Relation result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public org.openstreetmap.osmosis.osmbinary.Osmformat.Relation buildPartial() {
        org.openstreetmap.osmosis.osmbinary.Osmformat.Relation result = new org.openstreetmap.osmosis.osmbinary.Osmformat.Relation(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          result.id_ = id_;
          to_bitField0_ |= 0x00000001;
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          keys_.makeImmutable();
          bitField0_ = (bitField0_ & ~0x00000002);
        }
        result.keys_ = keys_;
        if (((bitField0_ & 0x00000004) != 0)) {
          vals_.makeImmutable();
          bitField0_ = (bitField0_ & ~0x00000004);
        }
        result.vals_ = vals_;
        if (((from_bitField0_ & 0x00000008) != 0)) {
          if (infoBuilder_ == null) {
            result.info_ = info_;
          } else {
            result.info_ = infoBuilder_.build();
          }
          to_bitField0_ |= 0x00000002;
        }
        if (((bitField0_ & 0x00000010) != 0)) {
          rolesSid_.makeImmutable();
          bitField0_ = (bitField0_ & ~0x00000010);
        }
        result.rolesSid_ = rolesSid_;
        if (((bitField0_ & 0x00000020) != 0)) {
          memids_.makeImmutable();
          bitField0_ = (bitField0_ & ~0x00000020);
        }
        result.memids_ = memids_;
        if (((bitField0_ & 0x00000040) != 0)) {
          types_ = java.util.Collections.unmodifiableList(types_);
          bitField0_ = (bitField0_ & ~0x00000040);
        }
        result.types_ = types_;
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      @java.lang.Override
      public Builder clone() {
        return super.clone();
      }
      @java.lang.Override
      public Builder setField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.setField(field, value);
      }
      @java.lang.Override
      public Builder clearField(
          com.google.protobuf.Descriptors.FieldDescriptor field) {
        return super.clearField(field);
      }
      @java.lang.Override
      public Builder clearOneof(
          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
        return super.clearOneof(oneof);
      }
      @java.lang.Override
      public Builder setRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          int index, java.lang.Object value) {
        return super.setRepeatedField(field, index, value);
      }
      @java.lang.Override
      public Builder addRepeatedField(
          com.google.protobuf.Descriptors.FieldDescriptor field,
          java.lang.Object value) {
        return super.addRepeatedField(field, value);
      }
      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof org.openstreetmap.osmosis.osmbinary.Osmformat.Relation) {
          return mergeFrom((org.openstreetmap.osmosis.osmbinary.Osmformat.Relation)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(org.openstreetmap.osmosis.osmbinary.Osmformat.Relation other) {
        if (other == org.openstreetmap.osmosis.osmbinary.Osmformat.Relation.getDefaultInstance()) return this;
        if (other.hasId()) {
          setId(other.getId());
        }
        if (!other.keys_.isEmpty()) {
          if (keys_.isEmpty()) {
            keys_ = other.keys_;
            bitField0_ = (bitField0_ & ~0x00000002);
          } else {
            ensureKeysIsMutable();
            keys_.addAll(other.keys_);
          }
          onChanged();
        }
        if (!other.vals_.isEmpty()) {
          if (vals_.isEmpty()) {
            vals_ = other.vals_;
            bitField0_ = (bitField0_ & ~0x00000004);
          } else {
            ensureValsIsMutable();
            vals_.addAll(other.vals_);
          }
          onChanged();
        }
        if (other.hasInfo()) {
          mergeInfo(other.getInfo());
        }
        if (!other.rolesSid_.isEmpty()) {
          if (rolesSid_.isEmpty()) {
            rolesSid_ = other.rolesSid_;
            bitField0_ = (bitField0_ & ~0x00000010);
          } else {
            ensureRolesSidIsMutable();
            rolesSid_.addAll(other.rolesSid_);
          }
          onChanged();
        }
        if (!other.memids_.isEmpty()) {
          if (memids_.isEmpty()) {
            memids_ = other.memids_;
            bitField0_ = (bitField0_ & ~0x00000020);
          } else {
            ensureMemidsIsMutable();
            memids_.addAll(other.memids_);
          }
          onChanged();
        }
        if (!other.types_.isEmpty()) {
          if (types_.isEmpty()) {
            types_ = other.types_;
            bitField0_ = (bitField0_ & ~0x00000040);
          } else {
            ensureTypesIsMutable();
            types_.addAll(other.types_);
          }
          onChanged();
        }
        this.mergeUnknownFields(other.unknownFields);
        onChanged();
        return this;
      }

      @java.lang.Override
      public final boolean isInitialized() {
        if (!hasId()) {
          return false;
        }
        return true;
      }

      @java.lang.Override
      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        org.openstreetmap.osmosis.osmbinary.Osmformat.Relation parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (org.openstreetmap.osmosis.osmbinary.Osmformat.Relation) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      private long id_ ;
      /**
       * <code>required int64 id = 1;</code>
       * @return Whether the id field is set.
       */
      @java.lang.Override
      public boolean hasId() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <code>required int64 id = 1;</code>
       * @return The id.
       */
      @java.lang.Override
      public long getId() {
        return id_;
      }
      /**
       * <code>required int64 id = 1;</code>
       * @param value The id to set.
       * @return This builder for chaining.
       */
      public Builder setId(long value) {
        bitField0_ |= 0x00000001;
        id_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>required int64 id = 1;</code>
       * @return This builder for chaining.
       */
      public Builder clearId() {
        bitField0_ = (bitField0_ & ~0x00000001);
        id_ = 0L;
        onChanged();
        return this;
      }

      private com.google.protobuf.Internal.IntList keys_ = emptyIntList();
      private void ensureKeysIsMutable() {
        if (!((bitField0_ & 0x00000002) != 0)) {
          keys_ = mutableCopy(keys_);
          bitField0_ |= 0x00000002;
         }
      }
      /**
       * <pre>
       * Parallel arrays.
       * </pre>
       *
       * <code>repeated uint32 keys = 2 [packed = true];</code>
       * @return A list containing the keys.
       */
      public java.util.List<java.lang.Integer>
          getKeysList() {
        return ((bitField0_ & 0x00000002) != 0) ?
                 java.util.Collections.unmodifiableList(keys_) : keys_;
      }
      /**
       * <pre>
       * Parallel arrays.
       * </pre>
       *
       * <code>repeated uint32 keys = 2 [packed = true];</code>
       * @return The count of keys.
       */
      public int getKeysCount() {
        return keys_.size();
      }
      /**
       * <pre>
       * Parallel arrays.
       * </pre>
       *
       * <code>repeated uint32 keys = 2 [packed = true];</code>
       * @param index The index of the element to return.
       * @return The keys at the given index.
       */
      public int getKeys(int index) {
        return keys_.getInt(index);
      }
      /**
       * <pre>
       * Parallel arrays.
       * </pre>
       *
       * <code>repeated uint32 keys = 2 [packed = true];</code>
       * @param index The index to set the value at.
       * @param value The keys to set.
       * @return This builder for chaining.
       */
      public Builder setKeys(
          int index, int value) {
        ensureKeysIsMutable();
        keys_.setInt(index, value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Parallel arrays.
       * </pre>
       *
       * <code>repeated uint32 keys = 2 [packed = true];</code>
       * @param value The keys to add.
       * @return This builder for chaining.
       */
      public Builder addKeys(int value) {
        ensureKeysIsMutable();
        keys_.addInt(value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Parallel arrays.
       * </pre>
       *
       * <code>repeated uint32 keys = 2 [packed = true];</code>
       * @param values The keys to add.
       * @return This builder for chaining.
       */
      public Builder addAllKeys(
          java.lang.Iterable<? extends java.lang.Integer> values) {
        ensureKeysIsMutable();
        com.google.protobuf.AbstractMessageLite.Builder.addAll(
            values, keys_);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Parallel arrays.
       * </pre>
       *
       * <code>repeated uint32 keys = 2 [packed = true];</code>
       * @return This builder for chaining.
       */
      public Builder clearKeys() {
        keys_ = emptyIntList();
        bitField0_ = (bitField0_ & ~0x00000002);
        onChanged();
        return this;
      }

      private com.google.protobuf.Internal.IntList vals_ = emptyIntList();
      private void ensureValsIsMutable() {
        if (!((bitField0_ & 0x00000004) != 0)) {
          vals_ = mutableCopy(vals_);
          bitField0_ |= 0x00000004;
         }
      }
      /**
       * <code>repeated uint32 vals = 3 [packed = true];</code>
       * @return A list containing the vals.
       */
      public java.util.List<java.lang.Integer>
          getValsList() {
        return ((bitField0_ & 0x00000004) != 0) ?
                 java.util.Collections.unmodifiableList(vals_) : vals_;
      }
      /**
       * <code>repeated uint32 vals = 3 [packed = true];</code>
       * @return The count of vals.
       */
      public int getValsCount() {
        return vals_.size();
      }
      /**
       * <code>repeated uint32 vals = 3 [packed = true];</code>
       * @param index The index of the element to return.
       * @return The vals at the given index.
       */
      public int getVals(int index) {
        return vals_.getInt(index);
      }
      /**
       * <code>repeated uint32 vals = 3 [packed = true];</code>
       * @param index The index to set the value at.
       * @param value The vals to set.
       * @return This builder for chaining.
       */
      public Builder setVals(
          int index, int value) {
        ensureValsIsMutable();
        vals_.setInt(index, value);
        onChanged();
        return this;
      }
      /**
       * <code>repeated uint32 vals = 3 [packed = true];</code>
       * @param value The vals to add.
       * @return This builder for chaining.
       */
      public Builder addVals(int value) {
        ensureValsIsMutable();
        vals_.addInt(value);
        onChanged();
        return this;
      }
      /**
       * <code>repeated uint32 vals = 3 [packed = true];</code>
       * @param values The vals to add.
       * @return This builder for chaining.
       */
      public Builder addAllVals(
          java.lang.Iterable<? extends java.lang.Integer> values) {
        ensureValsIsMutable();
        com.google.protobuf.AbstractMessageLite.Builder.addAll(
            values, vals_);
        onChanged();
        return this;
      }
      /**
       * <code>repeated uint32 vals = 3 [packed = true];</code>
       * @return This builder for chaining.
       */
      public Builder clearVals() {
        vals_ = emptyIntList();
        bitField0_ = (bitField0_ & ~0x00000004);
        onChanged();
        return this;
      }

      private org.openstreetmap.osmosis.osmbinary.Osmformat.Info info_;
      private com.google.protobuf.SingleFieldBuilderV3<
          org.openstreetmap.osmosis.osmbinary.Osmformat.Info, org.openstreetmap.osmosis.osmbinary.Osmformat.Info.Builder, org.openstreetmap.osmosis.osmbinary.Osmformat.InfoOrBuilder> infoBuilder_;
      /**
       * <code>optional .OSMPBF.Info info = 4;</code>
       * @return Whether the info field is set.
       */
      public boolean hasInfo() {
        return ((bitField0_ & 0x00000008) != 0);
      }
      /**
       * <code>optional .OSMPBF.Info info = 4;</code>
       * @return The info.
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.Info getInfo() {
        if (infoBuilder_ == null) {
          return info_ == null ? org.openstreetmap.osmosis.osmbinary.Osmformat.Info.getDefaultInstance() : info_;
        } else {
          return infoBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .OSMPBF.Info info = 4;</code>
       */
      public Builder setInfo(org.openstreetmap.osmosis.osmbinary.Osmformat.Info value) {
        if (infoBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          info_ = value;
          onChanged();
        } else {
          infoBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000008;
        return this;
      }
      /**
       * <code>optional .OSMPBF.Info info = 4;</code>
       */
      public Builder setInfo(
          org.openstreetmap.osmosis.osmbinary.Osmformat.Info.Builder builderForValue) {
        if (infoBuilder_ == null) {
          info_ = builderForValue.build();
          onChanged();
        } else {
          infoBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000008;
        return this;
      }
      /**
       * <code>optional .OSMPBF.Info info = 4;</code>
       */
      public Builder mergeInfo(org.openstreetmap.osmosis.osmbinary.Osmformat.Info value) {
        if (infoBuilder_ == null) {
          if (((bitField0_ & 0x00000008) != 0) &&
              info_ != null &&
              info_ != org.openstreetmap.osmosis.osmbinary.Osmformat.Info.getDefaultInstance()) {
            info_ =
              org.openstreetmap.osmosis.osmbinary.Osmformat.Info.newBuilder(info_).mergeFrom(value).buildPartial();
          } else {
            info_ = value;
          }
          onChanged();
        } else {
          infoBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000008;
        return this;
      }
      /**
       * <code>optional .OSMPBF.Info info = 4;</code>
       */
      public Builder clearInfo() {
        if (infoBuilder_ == null) {
          info_ = null;
          onChanged();
        } else {
          infoBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000008);
        return this;
      }
      /**
       * <code>optional .OSMPBF.Info info = 4;</code>
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.Info.Builder getInfoBuilder() {
        bitField0_ |= 0x00000008;
        onChanged();
        return getInfoFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .OSMPBF.Info info = 4;</code>
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.InfoOrBuilder getInfoOrBuilder() {
        if (infoBuilder_ != null) {
          return infoBuilder_.getMessageOrBuilder();
        } else {
          return info_ == null ?
              org.openstreetmap.osmosis.osmbinary.Osmformat.Info.getDefaultInstance() : info_;
        }
      }
      /**
       * <code>optional .OSMPBF.Info info = 4;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          org.openstreetmap.osmosis.osmbinary.Osmformat.Info, org.openstreetmap.osmosis.osmbinary.Osmformat.Info.Builder, org.openstreetmap.osmosis.osmbinary.Osmformat.InfoOrBuilder> 
          getInfoFieldBuilder() {
        if (infoBuilder_ == null) {
          infoBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              org.openstreetmap.osmosis.osmbinary.Osmformat.Info, org.openstreetmap.osmosis.osmbinary.Osmformat.Info.Builder, org.openstreetmap.osmosis.osmbinary.Osmformat.InfoOrBuilder>(
                  getInfo(),
                  getParentForChildren(),
                  isClean());
          info_ = null;
        }
        return infoBuilder_;
      }

      private com.google.protobuf.Internal.IntList rolesSid_ = emptyIntList();
      private void ensureRolesSidIsMutable() {
        if (!((bitField0_ & 0x00000010) != 0)) {
          rolesSid_ = mutableCopy(rolesSid_);
          bitField0_ |= 0x00000010;
         }
      }
      /**
       * <pre>
       * Parallel arrays
       * </pre>
       *
       * <code>repeated int32 roles_sid = 8 [packed = true];</code>
       * @return A list containing the rolesSid.
       */
      public java.util.List<java.lang.Integer>
          getRolesSidList() {
        return ((bitField0_ & 0x00000010) != 0) ?
                 java.util.Collections.unmodifiableList(rolesSid_) : rolesSid_;
      }
      /**
       * <pre>
       * Parallel arrays
       * </pre>
       *
       * <code>repeated int32 roles_sid = 8 [packed = true];</code>
       * @return The count of rolesSid.
       */
      public int getRolesSidCount() {
        return rolesSid_.size();
      }
      /**
       * <pre>
       * Parallel arrays
       * </pre>
       *
       * <code>repeated int32 roles_sid = 8 [packed = true];</code>
       * @param index The index of the element to return.
       * @return The rolesSid at the given index.
       */
      public int getRolesSid(int index) {
        return rolesSid_.getInt(index);
      }
      /**
       * <pre>
       * Parallel arrays
       * </pre>
       *
       * <code>repeated int32 roles_sid = 8 [packed = true];</code>
       * @param index The index to set the value at.
       * @param value The rolesSid to set.
       * @return This builder for chaining.
       */
      public Builder setRolesSid(
          int index, int value) {
        ensureRolesSidIsMutable();
        rolesSid_.setInt(index, value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Parallel arrays
       * </pre>
       *
       * <code>repeated int32 roles_sid = 8 [packed = true];</code>
       * @param value The rolesSid to add.
       * @return This builder for chaining.
       */
      public Builder addRolesSid(int value) {
        ensureRolesSidIsMutable();
        rolesSid_.addInt(value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Parallel arrays
       * </pre>
       *
       * <code>repeated int32 roles_sid = 8 [packed = true];</code>
       * @param values The rolesSid to add.
       * @return This builder for chaining.
       */
      public Builder addAllRolesSid(
          java.lang.Iterable<? extends java.lang.Integer> values) {
        ensureRolesSidIsMutable();
        com.google.protobuf.AbstractMessageLite.Builder.addAll(
            values, rolesSid_);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Parallel arrays
       * </pre>
       *
       * <code>repeated int32 roles_sid = 8 [packed = true];</code>
       * @return This builder for chaining.
       */
      public Builder clearRolesSid() {
        rolesSid_ = emptyIntList();
        bitField0_ = (bitField0_ & ~0x00000010);
        onChanged();
        return this;
      }

      private com.google.protobuf.Internal.LongList memids_ = emptyLongList();
      private void ensureMemidsIsMutable() {
        if (!((bitField0_ & 0x00000020) != 0)) {
          memids_ = mutableCopy(memids_);
          bitField0_ |= 0x00000020;
         }
      }
      /**
       * <pre>
       * DELTA encoded
       * </pre>
       *
       * <code>repeated sint64 memids = 9 [packed = true];</code>
       * @return A list containing the memids.
       */
      public java.util.List<java.lang.Long>
          getMemidsList() {
        return ((bitField0_ & 0x00000020) != 0) ?
                 java.util.Collections.unmodifiableList(memids_) : memids_;
      }
      /**
       * <pre>
       * DELTA encoded
       * </pre>
       *
       * <code>repeated sint64 memids = 9 [packed = true];</code>
       * @return The count of memids.
       */
      public int getMemidsCount() {
        return memids_.size();
      }
      /**
       * <pre>
       * DELTA encoded
       * </pre>
       *
       * <code>repeated sint64 memids = 9 [packed = true];</code>
       * @param index The index of the element to return.
       * @return The memids at the given index.
       */
      public long getMemids(int index) {
        return memids_.getLong(index);
      }
      /**
       * <pre>
       * DELTA encoded
       * </pre>
       *
       * <code>repeated sint64 memids = 9 [packed = true];</code>
       * @param index The index to set the value at.
       * @param value The memids to set.
       * @return This builder for chaining.
       */
      public Builder setMemids(
          int index, long value) {
        ensureMemidsIsMutable();
        memids_.setLong(index, value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * DELTA encoded
       * </pre>
       *
       * <code>repeated sint64 memids = 9 [packed = true];</code>
       * @param value The memids to add.
       * @return This builder for chaining.
       */
      public Builder addMemids(long value) {
        ensureMemidsIsMutable();
        memids_.addLong(value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * DELTA encoded
       * </pre>
       *
       * <code>repeated sint64 memids = 9 [packed = true];</code>
       * @param values The memids to add.
       * @return This builder for chaining.
       */
      public Builder addAllMemids(
          java.lang.Iterable<? extends java.lang.Long> values) {
        ensureMemidsIsMutable();
        com.google.protobuf.AbstractMessageLite.Builder.addAll(
            values, memids_);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * DELTA encoded
       * </pre>
       *
       * <code>repeated sint64 memids = 9 [packed = true];</code>
       * @return This builder for chaining.
       */
      public Builder clearMemids() {
        memids_ = emptyLongList();
        bitField0_ = (bitField0_ & ~0x00000020);
        onChanged();
        return this;
      }

      private java.util.List<java.lang.Integer> types_ =
        java.util.Collections.emptyList();
      private void ensureTypesIsMutable() {
        if (!((bitField0_ & 0x00000040) != 0)) {
          types_ = new java.util.ArrayList<java.lang.Integer>(types_);
          bitField0_ |= 0x00000040;
        }
      }
      /**
       * <code>repeated .OSMPBF.Relation.MemberType types = 10 [packed = true];</code>
       * @return A list containing the types.
       */
      public java.util.List<org.openstreetmap.osmosis.osmbinary.Osmformat.Relation.MemberType> getTypesList() {
        return new com.google.protobuf.Internal.ListAdapter<
            java.lang.Integer, org.openstreetmap.osmosis.osmbinary.Osmformat.Relation.MemberType>(types_, types_converter_);
      }
      /**
       * <code>repeated .OSMPBF.Relation.MemberType types = 10 [packed = true];</code>
       * @return The count of types.
       */
      public int getTypesCount() {
        return types_.size();
      }
      /**
       * <code>repeated .OSMPBF.Relation.MemberType types = 10 [packed = true];</code>
       * @param index The index of the element to return.
       * @return The types at the given index.
       */
      public org.openstreetmap.osmosis.osmbinary.Osmformat.Relation.MemberType getTypes(int index) {
        return types_converter_.convert(types_.get(index));
      }
      /**
       * <code>repeated .OSMPBF.Relation.MemberType types = 10 [packed = true];</code>
       * @param index The index to set the value at.
       * @param value The types to set.
       * @return This builder for chaining.
       */
      public Builder setTypes(
          int index, org.openstreetmap.osmosis.osmbinary.Osmformat.Relation.MemberType value) {
        if (value == null) {
          throw new NullPointerException();
        }
        ensureTypesIsMutable();
        types_.set(index, value.getNumber());
        onChanged();
        return this;
      }
      /**
       * <code>repeated .OSMPBF.Relation.MemberType types = 10 [packed = true];</code>
       * @param value The types to add.
       * @return This builder for chaining.
       */
      public Builder addTypes(org.openstreetmap.osmosis.osmbinary.Osmformat.Relation.MemberType value) {
        if (value == null) {
          throw new NullPointerException();
        }
        ensureTypesIsMutable();
        types_.add(value.getNumber());
        onChanged();
        return this;
      }
      /**
       * <code>repeated .OSMPBF.Relation.MemberType types = 10 [packed = true];</code>
       * @param values The types to add.
       * @return This builder for chaining.
       */
      public Builder addAllTypes(
          java.lang.Iterable<? extends org.openstreetmap.osmosis.osmbinary.Osmformat.Relation.MemberType> values) {
        ensureTypesIsMutable();
        for (org.openstreetmap.osmosis.osmbinary.Osmformat.Relation.MemberType value : values) {
          types_.add(value.getNumber());
        }
        onChanged();
        return this;
      }
      /**
       * <code>repeated .OSMPBF.Relation.MemberType types = 10 [packed = true];</code>
       * @return This builder for chaining.
       */
      public Builder clearTypes() {
        types_ = java.util.Collections.emptyList();
        bitField0_ = (bitField0_ & ~0x00000040);
        onChanged();
        return this;
      }
      @java.lang.Override
      public final Builder setUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.setUnknownFields(unknownFields);
      }

      @java.lang.Override
      public final Builder mergeUnknownFields(
          final com.google.protobuf.UnknownFieldSet unknownFields) {
        return super.mergeUnknownFields(unknownFields);
      }


      // @@protoc_insertion_point(builder_scope:OSMPBF.Relation)
    }

    // @@protoc_insertion_point(class_scope:OSMPBF.Relation)
    private static final org.openstreetmap.osmosis.osmbinary.Osmformat.Relation DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new org.openstreetmap.osmosis.osmbinary.Osmformat.Relation();
    }

    public static org.openstreetmap.osmosis.osmbinary.Osmformat.Relation getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    @java.lang.Deprecated public static final com.google.protobuf.Parser<Relation>
        PARSER = new com.google.protobuf.AbstractParser<Relation>() {
      @java.lang.Override
      public Relation parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new Relation(input, extensionRegistry);
      }
    };

    public static com.google.protobuf.Parser<Relation> parser() {
      return PARSER;
    }

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

    @java.lang.Override
    public org.openstreetmap.osmosis.osmbinary.Osmformat.Relation getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_OSMPBF_HeaderBlock_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_OSMPBF_HeaderBlock_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_OSMPBF_HeaderBBox_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_OSMPBF_HeaderBBox_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_OSMPBF_PrimitiveBlock_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_OSMPBF_PrimitiveBlock_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_OSMPBF_PrimitiveGroup_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_OSMPBF_PrimitiveGroup_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_OSMPBF_StringTable_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_OSMPBF_StringTable_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_OSMPBF_Info_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_OSMPBF_Info_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_OSMPBF_DenseInfo_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_OSMPBF_DenseInfo_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_OSMPBF_ChangeSet_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_OSMPBF_ChangeSet_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_OSMPBF_Node_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_OSMPBF_Node_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_OSMPBF_DenseNodes_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_OSMPBF_DenseNodes_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_OSMPBF_Way_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_OSMPBF_Way_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_OSMPBF_Relation_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_OSMPBF_Relation_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!src/main/protobuf/osmformat.proto\022\006OSM" +
      "PBF\"\207\002\n\013HeaderBlock\022 \n\004bbox\030\001 \001(\0132\022.OSMP" +
      "BF.HeaderBBox\022\031\n\021required_features\030\004 \003(\t" +
      "\022\031\n\021optional_features\030\005 \003(\t\022\026\n\016writingpr" +
      "ogram\030\020 \001(\t\022\016\n\006source\030\021 \001(\t\022%\n\035osmosis_r" +
      "eplication_timestamp\030  \001(\003\022+\n#osmosis_re" +
      "plication_sequence_number\030! \001(\003\022$\n\034osmos" +
      "is_replication_base_url\030\" \001(\t\"F\n\nHeaderB" +
      "Box\022\014\n\004left\030\001 \002(\022\022\r\n\005right\030\002 \002(\022\022\013\n\003top\030" +
      "\003 \002(\022\022\016\n\006bottom\030\004 \002(\022\"\322\001\n\016PrimitiveBlock" +
      "\022(\n\013stringtable\030\001 \002(\0132\023.OSMPBF.StringTab" +
      "le\022.\n\016primitivegroup\030\002 \003(\0132\026.OSMPBF.Prim" +
      "itiveGroup\022\030\n\013granularity\030\021 \001(\005:\003100\022\025\n\n" +
      "lat_offset\030\023 \001(\003:\0010\022\025\n\nlon_offset\030\024 \001(\003:" +
      "\0010\022\036\n\020date_granularity\030\022 \001(\005:\0041000\"\267\001\n\016P" +
      "rimitiveGroup\022\033\n\005nodes\030\001 \003(\0132\014.OSMPBF.No" +
      "de\022!\n\005dense\030\002 \001(\0132\022.OSMPBF.DenseNodes\022\031\n" +
      "\004ways\030\003 \003(\0132\013.OSMPBF.Way\022#\n\trelations\030\004 " +
      "\003(\0132\020.OSMPBF.Relation\022%\n\nchangesets\030\005 \003(" +
      "\0132\021.OSMPBF.ChangeSet\"\030\n\013StringTable\022\t\n\001s" +
      "\030\001 \003(\014\"q\n\004Info\022\023\n\007version\030\001 \001(\005:\002-1\022\021\n\tt" +
      "imestamp\030\002 \001(\003\022\021\n\tchangeset\030\003 \001(\003\022\013\n\003uid" +
      "\030\004 \001(\005\022\020\n\010user_sid\030\005 \001(\r\022\017\n\007visible\030\006 \001(" +
      "\010\"\212\001\n\tDenseInfo\022\023\n\007version\030\001 \003(\005B\002\020\001\022\025\n\t" +
      "timestamp\030\002 \003(\022B\002\020\001\022\025\n\tchangeset\030\003 \003(\022B\002" +
      "\020\001\022\017\n\003uid\030\004 \003(\021B\002\020\001\022\024\n\010user_sid\030\005 \003(\021B\002\020" +
      "\001\022\023\n\007visible\030\006 \003(\010B\002\020\001\"\027\n\tChangeSet\022\n\n\002i" +
      "d\030\001 \002(\003\"l\n\004Node\022\n\n\002id\030\001 \002(\022\022\020\n\004keys\030\002 \003(" +
      "\rB\002\020\001\022\020\n\004vals\030\003 \003(\rB\002\020\001\022\032\n\004info\030\004 \001(\0132\014." +
      "OSMPBF.Info\022\013\n\003lat\030\010 \002(\022\022\013\n\003lon\030\t \002(\022\"{\n" +
      "\nDenseNodes\022\016\n\002id\030\001 \003(\022B\002\020\001\022$\n\tdenseinfo" +
      "\030\005 \001(\0132\021.OSMPBF.DenseInfo\022\017\n\003lat\030\010 \003(\022B\002" +
      "\020\001\022\017\n\003lon\030\t \003(\022B\002\020\001\022\025\n\tkeys_vals\030\n \003(\005B\002" +
      "\020\001\"\205\001\n\003Way\022\n\n\002id\030\001 \002(\003\022\020\n\004keys\030\002 \003(\rB\002\020\001" +
      "\022\020\n\004vals\030\003 \003(\rB\002\020\001\022\032\n\004info\030\004 \001(\0132\014.OSMPB" +
      "F.Info\022\020\n\004refs\030\010 \003(\022B\002\020\001\022\017\n\003lat\030\t \003(\022B\002\020" +
      "\001\022\017\n\003lon\030\n \003(\022B\002\020\001\"\340\001\n\010Relation\022\n\n\002id\030\001 " +
      "\002(\003\022\020\n\004keys\030\002 \003(\rB\002\020\001\022\020\n\004vals\030\003 \003(\rB\002\020\001\022" +
      "\032\n\004info\030\004 \001(\0132\014.OSMPBF.Info\022\025\n\troles_sid" +
      "\030\010 \003(\005B\002\020\001\022\022\n\006memids\030\t \003(\022B\002\020\001\022.\n\005types\030" +
      "\n \003(\0162\033.OSMPBF.Relation.MemberTypeB\002\020\001\"-" +
      "\n\nMemberType\022\010\n\004NODE\020\000\022\007\n\003WAY\020\001\022\014\n\010RELAT" +
      "ION\020\002B%\n#org.openstreetmap.osmosis.osmbi" +
      "nary"
    };
    descriptor = com.google.protobuf.Descriptors.FileDescriptor
      .internalBuildGeneratedFileFrom(descriptorData,
        new com.google.protobuf.Descriptors.FileDescriptor[] {
        });
    internal_static_OSMPBF_HeaderBlock_descriptor =
      getDescriptor().getMessageTypes().get(0);
    internal_static_OSMPBF_HeaderBlock_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_OSMPBF_HeaderBlock_descriptor,
        new java.lang.String[] { "Bbox", "RequiredFeatures", "OptionalFeatures", "Writingprogram", "Source", "OsmosisReplicationTimestamp", "OsmosisReplicationSequenceNumber", "OsmosisReplicationBaseUrl", });
    internal_static_OSMPBF_HeaderBBox_descriptor =
      getDescriptor().getMessageTypes().get(1);
    internal_static_OSMPBF_HeaderBBox_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_OSMPBF_HeaderBBox_descriptor,
        new java.lang.String[] { "Left", "Right", "Top", "Bottom", });
    internal_static_OSMPBF_PrimitiveBlock_descriptor =
      getDescriptor().getMessageTypes().get(2);
    internal_static_OSMPBF_PrimitiveBlock_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_OSMPBF_PrimitiveBlock_descriptor,
        new java.lang.String[] { "Stringtable", "Primitivegroup", "Granularity", "LatOffset", "LonOffset", "DateGranularity", });
    internal_static_OSMPBF_PrimitiveGroup_descriptor =
      getDescriptor().getMessageTypes().get(3);
    internal_static_OSMPBF_PrimitiveGroup_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_OSMPBF_PrimitiveGroup_descriptor,
        new java.lang.String[] { "Nodes", "Dense", "Ways", "Relations", "Changesets", });
    internal_static_OSMPBF_StringTable_descriptor =
      getDescriptor().getMessageTypes().get(4);
    internal_static_OSMPBF_StringTable_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_OSMPBF_StringTable_descriptor,
        new java.lang.String[] { "S", });
    internal_static_OSMPBF_Info_descriptor =
      getDescriptor().getMessageTypes().get(5);
    internal_static_OSMPBF_Info_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_OSMPBF_Info_descriptor,
        new java.lang.String[] { "Version", "Timestamp", "Changeset", "Uid", "UserSid", "Visible", });
    internal_static_OSMPBF_DenseInfo_descriptor =
      getDescriptor().getMessageTypes().get(6);
    internal_static_OSMPBF_DenseInfo_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_OSMPBF_DenseInfo_descriptor,
        new java.lang.String[] { "Version", "Timestamp", "Changeset", "Uid", "UserSid", "Visible", });
    internal_static_OSMPBF_ChangeSet_descriptor =
      getDescriptor().getMessageTypes().get(7);
    internal_static_OSMPBF_ChangeSet_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_OSMPBF_ChangeSet_descriptor,
        new java.lang.String[] { "Id", });
    internal_static_OSMPBF_Node_descriptor =
      getDescriptor().getMessageTypes().get(8);
    internal_static_OSMPBF_Node_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_OSMPBF_Node_descriptor,
        new java.lang.String[] { "Id", "Keys", "Vals", "Info", "Lat", "Lon", });
    internal_static_OSMPBF_DenseNodes_descriptor =
      getDescriptor().getMessageTypes().get(9);
    internal_static_OSMPBF_DenseNodes_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_OSMPBF_DenseNodes_descriptor,
        new java.lang.String[] { "Id", "Denseinfo", "Lat", "Lon", "KeysVals", });
    internal_static_OSMPBF_Way_descriptor =
      getDescriptor().getMessageTypes().get(10);
    internal_static_OSMPBF_Way_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_OSMPBF_Way_descriptor,
        new java.lang.String[] { "Id", "Keys", "Vals", "Info", "Refs", "Lat", "Lon", });
    internal_static_OSMPBF_Relation_descriptor =
      getDescriptor().getMessageTypes().get(11);
    internal_static_OSMPBF_Relation_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_OSMPBF_Relation_descriptor,
        new java.lang.String[] { "Id", "Keys", "Vals", "Info", "RolesSid", "Memids", "Types", });
  }

  // @@protoc_insertion_point(outer_class_scope)
}
