    syntax = "proto2";

    package example;

    message Object {
      required string name = 1;
      required int32 identifier = 2;
      optional string address = 3;

      enum ObjectType {
        LOCAL = 0;
        REMOTE = 1;
        NEITHER = 2;
        default = 3; // no keyword
      }

      message ObjectData {
        required string number = 1;
        optional ObjectType type = 2 [default = NEITHER];
        optional ObjectType other = 3 [default = default];
        //                                       ^ no keyword
      }

      repeated ObjectData dataList = 4;

      string string = 5;
      //     ^ no data type
      string default = 5;
      //     ^ no keyword
    }

    message ObjectList {
      repeated Object object = 1;
    }

    enum EnumAllowingAlias {
      option allow_alias = true;
      EAA_UNSPECIFIED = 0;
      EAA_STARTED = 1;
      EAA_RUNNING = 1;
      EAA_FINISHED = 2;
    }

    message SomeOtherMessage {
      SearchResponse.Result result = 1;
    }

    package media;

    // A container message to hold stuff that a user has created.
    message UserContent {
      // Set verification to `DECLARATION` to enforce extension declarations for all
      // extensions in this range.
      extensions 100 to 199 [verification = DECLARATION];
    }

    // A container message to hold stuff that a user has created.
    message UserContent {
      extensions 100 to 199 [
        declaration = {
          number: 126,
          full_name: ".kittens.kitten_videos",
          type: ".kittens.Video",
          repeated: true
        },
        // Ensures all field numbers in this extension range are declarations.
        verification = DECLARATION
      ];
    }

    service SearchService {
      rpc Search(SearchRequest) returns (SearchResponse);
    }

    message RequestType {}
    message ResponseType {}

    service MyService {
      option (my_service_option) = FOO;

      rpc MyMethod(RequestType) returns(ResponseType) {
        // Note:  my_method_option has type MyMessage.  We can set each field
        //   within it using a separate "option" line.
        option (my_method_option).foo = 567;
        option (my_method_option).bar = "Some string";
      }
    }

    import "google/protobuf/descriptor.proto";

    extend google.protobuf.EnumValueOptions {
      string string_name = 123456789;
    }

    enum Data {
      DATA_UNSPECIFIED = 0;
      DATA_SEARCH = 1 [deprecated = true];
      DATA_DISPLAY = 2 [
        (string_name) = "x\uafe23\U000123456\nx\x433\xag\0123\u1xx\p\U0010ai"
      ];
    }

    message Outer {
      option (my_option).a = true;
      message Inner {   // Level 2
        required int64 ival = 1;
      }
      map<int32, string> my_map = 2;
      extensions 20 to 30;
      float n = .2;
      float n = inf;
    }