// Generated by the protocol buffer compiler.  DO NOT EDIT!
// source: src/test/protobuf/test_multiple_files.proto
// Protobuf Java Version: 4.26.1

package org.apache.avro.protobuf.multiplefiles;

public final class TestMultipleFiles {
  private TestMultipleFiles() {
  }

  static {
    com.google.protobuf.RuntimeVersion.validateProtobufGencodeVersion(
        com.google.protobuf.RuntimeVersion.RuntimeDomain.PUBLIC, /* major= */ 4, /* minor= */ 26, /* patch= */ 1,
        /* suffix= */ "", TestMultipleFiles.class.getName());
  }

  public static void registerAllExtensions(com.google.protobuf.ExtensionRegistryLite registry) {
  }

  public static void registerAllExtensions(com.google.protobuf.ExtensionRegistry registry) {
    registerAllExtensions((com.google.protobuf.ExtensionRegistryLite) registry);
  }

  static final com.google.protobuf.Descriptors.Descriptor internal_static_org_apache_avro_protobuf_multiplefiles_Foo_descriptor;
  static final com.google.protobuf.GeneratedMessage.FieldAccessorTable internal_static_org_apache_avro_protobuf_multiplefiles_Foo_fieldAccessorTable;
  static final com.google.protobuf.Descriptors.Descriptor internal_static_org_apache_avro_protobuf_multiplefiles_M_descriptor;
  static final com.google.protobuf.GeneratedMessage.FieldAccessorTable internal_static_org_apache_avro_protobuf_multiplefiles_M_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/test/protobuf/test_multiple_files."
        + "proto\022&org.apache.avro.protobuf.multiple" + "files\032\037google/protobuf/timestamp.proto\"\244"
        + "\004\n\003Foo\022\r\n\005int32\030\001 \002(\005\022\r\n\005int64\030\002 \001(\003\022\016\n\006"
        + "uint32\030\003 \001(\r\022\016\n\006uint64\030\004 \001(\004\022\016\n\006sint32\030\005"
        + " \001(\021\022\016\n\006sint64\030\006 \001(\022\022\017\n\007fixed32\030\007 \001(\007\022\017\n"
        + "\007fixed64\030\010 \001(\006\022\020\n\010sfixed32\030\t \001(\017\022\020\n\010sfix"
        + "ed64\030\n \001(\020\022\r\n\005float\030\013 \001(\002\022\016\n\006double\030\014 \001("
        + "\001\022\014\n\004bool\030\r \001(\010\022\016\n\006string\030\016 \001(\t\022\r\n\005bytes"
        + "\030\017 \001(\014\022:\n\004enum\030\020 \001(\0162).org.apache.avro.p"
        + "rotobuf.multiplefiles.A:\001Z\022\020\n\010intArray\030\021"
        + " \003(\005\022=\n\010fooArray\030\024 \003(\0132+.org.apache.avro"
        + ".protobuf.multiplefiles.Foo\0227\n\004syms\030\023 \003(" + "\0162).org.apache.avro.protobuf.multiplefil"
        + "es.A\0228\n\003foo\030\022 \001(\0132+.org.apache.avro.prot"
        + "obuf.multiplefiles.Foo\022-\n\ttimestamp\030\025 \001("
        + "\0132\032.google.protobuf.Timestamp\"\017\n\001M\"\n\n\001N\022"
        + "\005\n\001A\020\001*\030\n\001A\022\005\n\001X\020\001\022\005\n\001Y\020\002\022\005\n\001Z\020\003B\002P\001" };
    descriptor = com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom(descriptorData,
        new com.google.protobuf.Descriptors.FileDescriptor[] { com.google.protobuf.TimestampProto.getDescriptor(), });
    internal_static_org_apache_avro_protobuf_multiplefiles_Foo_descriptor = getDescriptor().getMessageTypes().get(0);
    internal_static_org_apache_avro_protobuf_multiplefiles_Foo_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable(
        internal_static_org_apache_avro_protobuf_multiplefiles_Foo_descriptor,
        new java.lang.String[] { "Int32", "Int64", "Uint32", "Uint64", "Sint32", "Sint64", "Fixed32", "Fixed64",
            "Sfixed32", "Sfixed64", "Float", "Double", "Bool", "String", "Bytes", "Enum", "IntArray", "FooArray",
            "Syms", "Foo", "Timestamp", });
    internal_static_org_apache_avro_protobuf_multiplefiles_M_descriptor = getDescriptor().getMessageTypes().get(1);
    internal_static_org_apache_avro_protobuf_multiplefiles_M_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable(
        internal_static_org_apache_avro_protobuf_multiplefiles_M_descriptor, new java.lang.String[] {});
    descriptor.resolveAllFeaturesImmutable();
    com.google.protobuf.TimestampProto.getDescriptor();
  }

  // @@protoc_insertion_point(outer_class_scope)
}
