From 055c812a4fe33b982b9eef9c56b9a3696c762494 Mon Sep 17 00:00:00 2001
From: Lasse Folger <lassefolger@google.com>
Date: Fri, 23 Feb 2024 13:03:15 +0100
Subject: [PATCH] encoding/prototext: add proto editions and fuzz tests

Change-Id: I2afc5ae83bf68600def3568e1d3ad51ef00e7671
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/566395
Auto-Submit: Lasse Folger <lassefolger@google.com>
Reviewed-by: Michael Stapelberg <stapelberg@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
---
 .../testdata/import_public/a.proto            |    2 +-
 encoding/prototext/decode_test.go             |  198 +++
 encoding/prototext/encode_test.go             |  218 ++-
 encoding/prototext/fuzz_test.go               |   98 ++
 .../testprotos/textpbeditions/test2.pb.go     | 1269 ++++++++++-------
 .../testprotos/textpbeditions/test2.proto     |   29 +
 6 files changed, 1314 insertions(+), 500 deletions(-)
 create mode 100644 encoding/prototext/fuzz_test.go

diff --git a/cmd/protoc-gen-go/testdata/import_public/a.proto b/cmd/protoc-gen-go/testdata/import_public/a.proto
index aa79b1b8..91b8f3c0 100644
--- a/cmd/protoc-gen-go/testdata/import_public/a.proto
+++ b/cmd/protoc-gen-go/testdata/import_public/a.proto
@@ -9,7 +9,7 @@ package goproto.protoc.import_public;
 // Same Go package.
 import public "cmd/protoc-gen-go/testdata/import_public/b.proto";
 
-// Different Go  package.
+// Different Go package.
 import public "cmd/protoc-gen-go/testdata/import_public/sub/a.proto";
 
 option go_package = "google.golang.org/protobuf/cmd/protoc-gen-go/testdata/import_public";
diff --git a/encoding/prototext/decode_test.go b/encoding/prototext/decode_test.go
index 15a4b78f..52842dd8 100644
--- a/encoding/prototext/decode_test.go
+++ b/encoding/prototext/decode_test.go
@@ -18,6 +18,7 @@ import (
 	weakpb "google.golang.org/protobuf/internal/testprotos/test/weak1"
 	pb2 "google.golang.org/protobuf/internal/testprotos/textpb2"
 	pb3 "google.golang.org/protobuf/internal/testprotos/textpb3"
+	pbeditions "google.golang.org/protobuf/internal/testprotos/textpbeditions"
 	"google.golang.org/protobuf/types/known/anypb"
 )
 
@@ -70,6 +71,62 @@ opt_string: ""
 			OptBytes:    []byte{},
 			OptString:   proto.String(""),
 		},
+	}, {
+		desc:         "protoeditions explicit scalars set to zero values",
+		inputMessage: &pbeditions.Scalars{},
+		inputText: `opt_bool: false
+opt_int32: 0
+opt_int64: 0
+opt_uint32: 0
+opt_uint64: 0
+opt_sint32: 0
+opt_sint64: 0
+opt_fixed32: 0
+opt_fixed64: 0
+opt_sfixed32: 0
+opt_sfixed64: 0
+opt_float: 0
+opt_double: 0
+opt_bytes: ""
+opt_string: ""
+`,
+		wantMessage: &pbeditions.Scalars{
+			OptBool:     proto.Bool(false),
+			OptInt32:    proto.Int32(0),
+			OptInt64:    proto.Int64(0),
+			OptUint32:   proto.Uint32(0),
+			OptUint64:   proto.Uint64(0),
+			OptSint32:   proto.Int32(0),
+			OptSint64:   proto.Int64(0),
+			OptFixed32:  proto.Uint32(0),
+			OptFixed64:  proto.Uint64(0),
+			OptSfixed32: proto.Int32(0),
+			OptSfixed64: proto.Int64(0),
+			OptFloat:    proto.Float32(0),
+			OptDouble:   proto.Float64(0),
+			OptBytes:    []byte{},
+			OptString:   proto.String(""),
+		},
+	}, {
+		desc:         "protoeditions implicit scalars set to zero values",
+		inputMessage: &pbeditions.ImplicitScalars{},
+		inputText: `s_bool: false
+s_int32: 0
+s_int64: 0
+s_uint32: 0
+s_uint64: 0
+s_sint32: 0
+s_sint64: 0
+s_fixed32: 0
+s_fixed64: 0
+s_sfixed32: 0
+s_sfixed64: 0
+s_float: 0
+s_double: 0
+s_bytes: ""
+s_string: ""
+`,
+		wantMessage: &pbeditions.ImplicitScalars{},
 	}, {
 		desc:         "proto3 scalars set to zero values",
 		inputMessage: &pb3.Scalars{},
@@ -150,6 +207,38 @@ opt_string: "谷歌"
 			OptBytes:    []byte("\xe8\xb0\xb7\xe6\xad\x8c"),
 			OptString:   proto.String("谷歌"),
 		},
+	}, {
+		desc:         "protoeditions explicit scalars",
+		inputMessage: &pbeditions.Scalars{},
+		inputText: `opt_bool: true
+opt_int32: 255
+opt_int64: 3735928559
+opt_uint32: 0xff
+opt_uint64: 0xdeadbeef
+opt_sint32: -1001
+opt_sint64: -   0xffff
+opt_fixed64: 64
+opt_sfixed32: -		32
+opt_float: 1.234
+opt_double: 1.23e+100
+opt_bytes: "\xe8\xb0\xb7\xe6\xad\x8c"
+opt_string: "谷歌"
+`,
+		wantMessage: &pbeditions.Scalars{
+			OptBool:     proto.Bool(true),
+			OptInt32:    proto.Int32(0xff),
+			OptInt64:    proto.Int64(0xdeadbeef),
+			OptUint32:   proto.Uint32(0xff),
+			OptUint64:   proto.Uint64(0xdeadbeef),
+			OptSint32:   proto.Int32(-1001),
+			OptSint64:   proto.Int64(-0xffff),
+			OptFixed64:  proto.Uint64(64),
+			OptSfixed32: proto.Int32(-32),
+			OptFloat:    proto.Float32(1.234),
+			OptDouble:   proto.Float64(1.23e100),
+			OptBytes:    []byte("\xe8\xb0\xb7\xe6\xad\x8c"),
+			OptString:   proto.String("谷歌"),
+		},
 	}, {
 		desc:         "case sensitive",
 		inputMessage: &pb3.Scalars{},
@@ -195,6 +284,13 @@ s_string: "谷歌"
 		wantMessage: &pb2.Scalars{
 			OptString: proto.String("abc\xff"),
 		},
+	}, {
+		desc:         "protoeditions unvalidated string with invalid UTF-8",
+		inputMessage: &pbeditions.Scalars{},
+		inputText:    `opt_string: "abc\xff"`,
+		wantMessage: &pbeditions.Scalars{
+			OptString: proto.String("abc\xff"),
+		},
 	}, {
 		desc:         "proto3 string with invalid UTF-8",
 		inputMessage: &pb3.Scalars{},
@@ -215,6 +311,11 @@ s_string: "谷歌"
 		umo:          prototext.UnmarshalOptions{DiscardUnknown: true},
 		inputMessage: &pb2.Scalars{},
 		inputText:    `unknown_field:123 1000:"hello"`,
+	}, {
+		desc:         "protoeditions message contains discarded unknown field",
+		umo:          prototext.UnmarshalOptions{DiscardUnknown: true},
+		inputMessage: &pbeditions.Scalars{},
+		inputText:    `unknown_field:123 1000:"hello"`,
 	}, {
 		desc:         "proto3 message contains discarded unknown field",
 		umo:          prototext.UnmarshalOptions{DiscardUnknown: true},
@@ -408,6 +509,39 @@ opt_nested_enum: UNO
 			OptEnum:       pb2.Enum_ONE.Enum(),
 			OptNestedEnum: pb2.Enums_UNO.Enum(),
 		},
+	}, {
+		desc:         "protoeditions closed enum",
+		inputMessage: &pbeditions.Enums{},
+		inputText: `
+opt_enum: ONE
+opt_nested_enum: UNO
+`,
+		wantMessage: &pbeditions.Enums{
+			OptEnum:       pbeditions.Enum_ONE.Enum(),
+			OptNestedEnum: pbeditions.Enums_UNO.Enum(),
+		},
+	}, {
+		desc:         "protoeditions open enum",
+		inputMessage: &pbeditions.Enums{},
+		inputText: `
+implicit_enum: EINS
+implicit_nested_enum: ZEHN
+`,
+		wantMessage: &pbeditions.Enums{
+			ImplicitEnum:       pbeditions.OpenEnum_EINS,
+			ImplicitNestedEnum: pbeditions.Enums_ZEHN,
+		},
+	}, {
+		desc:         "protoeditions enum numeric value",
+		inputMessage: &pbeditions.Enums{},
+		inputText: `
+implicit_enum: 1
+implicit_nested_enum: 10
+`,
+		wantMessage: &pbeditions.Enums{
+			ImplicitEnum:       pbeditions.OpenEnum_EINS,
+			ImplicitNestedEnum: pbeditions.Enums_ZEHN,
+		},
 	}, {
 		desc:         "proto2 enum set to numeric values",
 		inputMessage: &pb2.Enums{},
@@ -482,6 +616,17 @@ OptGroup: {}
 			OptNested: &pb2.Nested{},
 			Optgroup:  &pb2.Nests_OptGroup{},
 		},
+	}, {
+		desc:         "protoeditions nested empty messages",
+		inputMessage: &pbeditions.Nests{},
+		inputText: `
+opt_nested: {}
+OptGroup: {}
+`,
+		wantMessage: &pbeditions.Nests{
+			OptNested: &pbeditions.Nested{},
+			Optgroup:  &pbeditions.Nests_OptGroup{},
+		},
 	}, {
 		desc:         "message fields with no field separator",
 		inputMessage: &pb2.Nests{},
@@ -493,11 +638,27 @@ OptGroup {}
 			OptNested: &pb2.Nested{},
 			Optgroup:  &pb2.Nests_OptGroup{},
 		},
+	}, {
+		desc:         "message fields with no field separator",
+		inputMessage: &pbeditions.Nests{},
+		inputText: `
+opt_nested {}
+OptGroup {}
+`,
+		wantMessage: &pbeditions.Nests{
+			OptNested: &pbeditions.Nested{},
+			Optgroup:  &pbeditions.Nests_OptGroup{},
+		},
 	}, {
 		desc:         "group field name",
 		inputMessage: &pb2.Nests{},
 		inputText:    `optgroup: {}`,
 		wantErr:      "unknown field: optgroup",
+	}, {
+		desc:         "delimited encoded message field name",
+		inputMessage: &pbeditions.Nests{},
+		inputText:    `optgroup: {}`,
+		wantErr:      "unknown field: optgroup",
 	}, {
 		desc:         "proto2 nested messages",
 		inputMessage: &pb2.Nests{},
@@ -517,6 +678,25 @@ opt_nested: {
 				},
 			},
 		},
+	}, {
+		desc:         "protoeditions delimited encoded nested messages",
+		inputMessage: &pbeditions.Nests{},
+		inputText: `
+opt_nested: {
+  opt_string: "nested message"
+  opt_nested: {
+    opt_string: "another nested message"
+  }
+}
+`,
+		wantMessage: &pbeditions.Nests{
+			OptNested: &pbeditions.Nested{
+				OptString: proto.String("nested message"),
+				OptNested: &pbeditions.Nested{
+					OptString: proto.String("another nested message"),
+				},
+			},
+		},
 	}, {
 		desc:         "proto3 nested empty message",
 		inputMessage: &pb3.Nests{},
@@ -711,6 +891,24 @@ RptGroup: {}
 				{},
 			},
 		},
+	}, {
+		desc:         "repeated delimited encoded message fields",
+		inputMessage: &pbeditions.Nests{},
+		inputText: `
+RptGroup: {
+  rpt_string: "hello"
+  rpt_string: "world"
+}
+RptGroup: {}
+`,
+		wantMessage: &pbeditions.Nests{
+			Rptgroup: []*pbeditions.Nests_RptGroup{
+				{
+					RptString: []string{"hello", "world"},
+				},
+				{},
+			},
+		},
 	}, {
 		desc:         "repeated message fields without field separator",
 		inputMessage: &pb2.Nests{},
diff --git a/encoding/prototext/encode_test.go b/encoding/prototext/encode_test.go
index 65b93cb4..e017faf9 100644
--- a/encoding/prototext/encode_test.go
+++ b/encoding/prototext/encode_test.go
@@ -20,6 +20,7 @@ import (
 
 	pb2 "google.golang.org/protobuf/internal/testprotos/textpb2"
 	pb3 "google.golang.org/protobuf/internal/testprotos/textpb3"
+	pbeditions "google.golang.org/protobuf/internal/testprotos/textpbeditions"
 	"google.golang.org/protobuf/types/known/anypb"
 )
 
@@ -40,6 +41,10 @@ func TestMarshal(t *testing.T) {
 		desc:  "proto2 optional scalars not set",
 		input: &pb2.Scalars{},
 		want:  "",
+	}, {
+		desc:  "protoeditions optional scalars not set",
+		input: &pbeditions.Scalars{},
+		want:  "",
 	}, {
 		desc:  "proto3 scalars not set",
 		input: &pb3.Scalars{},
@@ -48,6 +53,10 @@ func TestMarshal(t *testing.T) {
 		desc:  "proto3 optional not set",
 		input: &pb3.Proto3Optional{},
 		want:  "",
+	}, {
+		desc:  "protoeditions implicit not set",
+		input: &pbeditions.ImplicitScalars{},
+		want:  "",
 	}, {
 		desc: "proto2 optional scalars set to zero values",
 		input: &pb2.Scalars{
@@ -82,6 +91,41 @@ opt_float: 0
 opt_double: 0
 opt_bytes: ""
 opt_string: ""
+`,
+	}, {
+		desc: "protoeditions optional scalars set to zero values",
+		input: &pbeditions.Scalars{
+			OptBool:     proto.Bool(false),
+			OptInt32:    proto.Int32(0),
+			OptInt64:    proto.Int64(0),
+			OptUint32:   proto.Uint32(0),
+			OptUint64:   proto.Uint64(0),
+			OptSint32:   proto.Int32(0),
+			OptSint64:   proto.Int64(0),
+			OptFixed32:  proto.Uint32(0),
+			OptFixed64:  proto.Uint64(0),
+			OptSfixed32: proto.Int32(0),
+			OptSfixed64: proto.Int64(0),
+			OptFloat:    proto.Float32(0),
+			OptDouble:   proto.Float64(0),
+			OptBytes:    []byte{},
+			OptString:   proto.String(""),
+		},
+		want: `opt_bool: false
+opt_int32: 0
+opt_int64: 0
+opt_uint32: 0
+opt_uint64: 0
+opt_sint32: 0
+opt_sint64: 0
+opt_fixed32: 0
+opt_fixed64: 0
+opt_sfixed32: 0
+opt_sfixed64: 0
+opt_float: 0
+opt_double: 0
+opt_bytes: ""
+opt_string: ""
 `,
 	}, {
 		desc: "proto3 optional set to zero values",
@@ -130,6 +174,26 @@ opt_message: {}
 			SString:   "",
 		},
 		want: "",
+	}, {
+		desc: "protoeditions implicit scalars set to zero values",
+		input: &pbeditions.ImplicitScalars{
+			SBool:     false,
+			SInt32:    0,
+			SInt64:    0,
+			SUint32:   0,
+			SUint64:   0,
+			SSint32:   0,
+			SSint64:   0,
+			SFixed32:  0,
+			SFixed64:  0,
+			SSfixed32: 0,
+			SSfixed64: 0,
+			SFloat:    0,
+			SDouble:   0,
+			SBytes:    []byte{},
+			SString:   "",
+		},
+		want: "",
 	}, {
 		desc: "proto2 optional scalars set to some values",
 		input: &pb2.Scalars{
@@ -160,6 +224,37 @@ opt_float: 1.02
 opt_double: 1.0199999809265137
 opt_bytes: "谷歌"
 opt_string: "谷歌"
+`,
+	}, {
+		desc: "proto editions optional scalars set to some values",
+		input: &pbeditions.Scalars{
+			OptBool:     proto.Bool(true),
+			OptInt32:    proto.Int32(0xff),
+			OptInt64:    proto.Int64(0xdeadbeef),
+			OptUint32:   proto.Uint32(47),
+			OptUint64:   proto.Uint64(0xdeadbeef),
+			OptSint32:   proto.Int32(-1001),
+			OptSint64:   proto.Int64(-0xffff),
+			OptFixed64:  proto.Uint64(64),
+			OptSfixed32: proto.Int32(-32),
+			OptFloat:    proto.Float32(1.02),
+			OptDouble:   proto.Float64(1.0199999809265137),
+			OptBytes:    []byte("\xe8\xb0\xb7\xe6\xad\x8c"),
+			OptString:   proto.String("谷歌"),
+		},
+		want: `opt_bool: true
+opt_int32: 255
+opt_int64: 3735928559
+opt_uint32: 47
+opt_uint64: 3735928559
+opt_sint32: -1001
+opt_sint64: -65535
+opt_fixed64: 64
+opt_sfixed32: -32
+opt_float: 1.02
+opt_double: 1.0199999809265137
+opt_bytes: "谷歌"
+opt_string: "谷歌"
 `,
 	}, {
 		desc: "proto2 string with invalid UTF-8",
@@ -167,6 +262,13 @@ opt_string: "谷歌"
 			OptString: proto.String("abc\xff"),
 		},
 		want: `opt_string: "abc\xff"
+`,
+	}, {
+		desc: "protoeditions string with invalid UTF-8",
+		input: &pbeditions.Scalars{
+			OptString: proto.String("abc\xff"),
+		},
+		want: `opt_string: "abc\xff"
 `,
 	}, {
 		desc: "proto3 string with invalid UTF-8",
@@ -174,6 +276,12 @@ opt_string: "谷歌"
 			SString: "abc\xff",
 		},
 		wantErr: true,
+	}, {
+		desc: "protoeditions utf8 validated string with invalid UTF-8",
+		input: &pbeditions.UTF8Validated{
+			ValidatedString: "abc\xff",
+		},
+		wantErr: true,
 	}, {
 		desc: "float nan",
 		input: &pb3.Scalars{
@@ -222,6 +330,15 @@ opt_string: "谷歌"
 		},
 		want: `opt_enum: 0
 opt_nested_enum: 0
+`,
+	}, {
+		desc: "protoeditions enum set to zero value",
+		input: &pbeditions.Enums{
+			OptEnum:       pbeditions.Enum(0).Enum(),
+			OptNestedEnum: pbeditions.Enums_NestedEnum(0).Enum(),
+		},
+		want: `opt_enum: 0
+opt_nested_enum: 0
 `,
 	}, {
 		desc: "proto2 enum",
@@ -231,6 +348,15 @@ opt_nested_enum: 0
 		},
 		want: `opt_enum: ONE
 opt_nested_enum: UNO
+`,
+	}, {
+		desc: "protoeditions enum",
+		input: &pbeditions.Enums{
+			OptEnum:       pbeditions.Enum_ONE.Enum(),
+			OptNestedEnum: pbeditions.Enums_UNO.Enum(),
+		},
+		want: `opt_enum: ONE
+opt_nested_enum: UNO
 `,
 	}, {
 		desc: "proto2 enum set to numeric values",
@@ -249,6 +375,15 @@ opt_nested_enum: DOS
 		},
 		want: `opt_enum: 101
 opt_nested_enum: -101
+`,
+	}, {
+		desc: "protoeditions enum set to unnamed numeric values",
+		input: &pbeditions.Enums{
+			OptEnum:       pbeditions.Enum(101).Enum(),
+			OptNestedEnum: pbeditions.Enums_NestedEnum(-101).Enum(),
+		},
+		want: `opt_enum: 101
+opt_nested_enum: -101
 `,
 	}, {
 		desc:  "proto3 enum not set",
@@ -261,6 +396,21 @@ opt_nested_enum: -101
 			SNestedEnum: pb3.Enums_CERO,
 		},
 		want: "",
+	}, {
+		desc: "protoeditions implicit enum field set to default value",
+		input: &pbeditions.Enums{
+			ImplicitEnum: pbeditions.OpenEnum_UNKNOWN,
+		},
+		want: "",
+	}, {
+		desc: "protoeditions implicit enum field",
+		input: &pbeditions.Enums{
+			ImplicitEnum:       pbeditions.OpenEnum_EINS,
+			ImplicitNestedEnum: pbeditions.Enums_ZEHN,
+		},
+		want: `implicit_enum: EINS
+implicit_nested_enum: ZEHN
+`,
 	}, {
 		desc: "proto3 enum",
 		input: &pb3.Enums{
@@ -278,6 +428,15 @@ s_nested_enum: UNO
 		},
 		want: `s_enum: TWO
 s_nested_enum: DOS
+`,
+	}, {
+		desc: "protoeditions implicit enum set to unnamed numeric values",
+		input: &pbeditions.Enums{
+			ImplicitEnum:       -47,
+			ImplicitNestedEnum: 47,
+		},
+		want: `implicit_enum: -47
+implicit_nested_enum: 47
 `,
 	}, {
 		desc: "proto3 enum set to unnamed numeric values",
@@ -300,6 +459,15 @@ s_nested_enum: 47
 		},
 		want: `opt_nested: {}
 OptGroup: {}
+`,
+	}, {
+		desc: "protoeditions nested message set to empty",
+		input: &pbeditions.Nests{
+			OptNested: &pbeditions.Nested{},
+			Optgroup:  &pbeditions.Nests_OptGroup{},
+		},
+		want: `opt_nested: {}
+OptGroup: {}
 `,
 	}, {
 		desc: "proto2 nested messages",
@@ -317,6 +485,23 @@ OptGroup: {}
     opt_string: "another nested message"
   }
 }
+`,
+	}, {
+		desc: "protoeditions nested messages",
+		input: &pbeditions.Nests{
+			OptNested: &pbeditions.Nested{
+				OptString: proto.String("nested message"),
+				OptNested: &pbeditions.Nested{
+					OptString: proto.String("another nested message"),
+				},
+			},
+		},
+		want: `opt_nested: {
+  opt_string: "nested message"
+  opt_nested: {
+    opt_string: "another nested message"
+  }
+}
 `,
 	}, {
 		desc: "proto2 groups",
@@ -340,6 +525,29 @@ OptGroup: {}
     opt_fixed32: 47
   }
 }
+`,
+	}, {
+		desc: "protoeditions delimited encoded meesage field",
+		input: &pbeditions.Nests{
+			Optgroup: &pbeditions.Nests_OptGroup{
+				OptString: proto.String("inside a group"),
+				OptNested: &pbeditions.Nested{
+					OptString: proto.String("nested message inside a group"),
+				},
+				Optnestedgroup: &pbeditions.Nests_OptGroup_OptNestedGroup{
+					OptFixed32: proto.Uint32(47),
+				},
+			},
+		},
+		want: `OptGroup: {
+  opt_string: "inside a group"
+  opt_nested: {
+    opt_string: "nested message inside a group"
+  }
+  OptNestedGroup: {
+    opt_fixed32: 47
+  }
+}
 `,
 	}, {
 		desc:  "proto3 nested message not set",
@@ -376,6 +584,14 @@ OptGroup: {}
 			},
 		},
 		wantErr: true,
+	}, {
+		desc: "protoeditions nested message contains invalid UTF-8",
+		input: &pbeditions.NestsUTF8Validated{
+			ValidatedMessage: &pbeditions.UTF8Validated{
+				ValidatedString: "abc\xff",
+			},
+		},
+		wantErr: true,
 	}, {
 		desc:  "oneof not set",
 		input: &pb3.Oneofs{},
@@ -1427,7 +1643,7 @@ value: "\x80"
 				t.Error("Marshal() got nil error, want error\n")
 			}
 			got := string(b)
-			if tt.want != "" && got != tt.want {
+			if got != tt.want {
 				t.Errorf("Marshal()\n<got>\n%v\n<want>\n%v\n", got, tt.want)
 				if diff := cmp.Diff(tt.want, got); diff != "" {
 					t.Errorf("Marshal() diff -want +got\n%v\n", diff)
diff --git a/encoding/prototext/fuzz_test.go b/encoding/prototext/fuzz_test.go
new file mode 100644
index 00000000..6e46d779
--- /dev/null
+++ b/encoding/prototext/fuzz_test.go
@@ -0,0 +1,98 @@
+// Copyright 2024 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Go native fuzzing was added in go1.18. Remove this once we stop supporting
+// go1.17.
+//go:build go1.18
+
+package prototext_test
+
+import (
+	"math"
+	"testing"
+
+	"github.com/google/go-cmp/cmp"
+	"google.golang.org/protobuf/encoding/prototext"
+	"google.golang.org/protobuf/proto"
+	"google.golang.org/protobuf/reflect/protoreflect"
+	"google.golang.org/protobuf/testing/protocmp"
+
+	testfuzzpb "google.golang.org/protobuf/internal/testprotos/editionsfuzztest"
+)
+
+// roundTripAndCompareProto tests if a prototext.Marshal/Unmarshal roundtrip
+// preserves the contents of the message. Note: wireBytes are a protocol
+// buffer wire format message, not the proto in text format. We do this because
+// a random stream of bytes (e.g. generated by the fuzz engine) is more likely
+// to be valid proto wire format than that it is valid text format.
+func roundTripAndCompareProto(t *testing.T, wireBytes []byte, messages ...proto.Message) {
+	for _, msg := range messages {
+		src := msg.ProtoReflect().Type().New().Interface()
+
+		if err := proto.Unmarshal(wireBytes, src); err != nil {
+			// Ignoring invalid wire format since we want to test the prototext
+			// implementation, not the wireformat implementation.
+			return
+		}
+
+		// Unknown fields are not marshaled by prototext so we strip them.
+		src.ProtoReflect().SetUnknown(nil)
+		var ranger func(protoreflect.FieldDescriptor, protoreflect.Value) bool
+		stripUnknown := func(m protoreflect.Message) {
+			m.SetUnknown(nil)
+			m.Range(ranger)
+		}
+		ranger = func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool {
+			switch {
+			case fd.IsMap():
+				if fd.MapValue().Message() != nil {
+					v.Map().Range(func(_ protoreflect.MapKey, v protoreflect.Value) bool {
+						stripUnknown(v.Message())
+						return true
+					})
+				}
+			case fd.Message() != nil:
+				if fd.Cardinality() == protoreflect.Repeated {
+					l := v.List()
+					for i := 0; i < l.Len(); i++ {
+						stripUnknown(l.Get(i).Message())
+					}
+				} else {
+					stripUnknown(v.Message())
+				}
+			}
+			return true
+		}
+		stripUnknown(src.ProtoReflect())
+
+		textFormat, err := prototext.Marshal(src)
+		if err != nil {
+			t.Errorf("failed to marshal messsage to text format: %v\nmessage: %v", err, src)
+		}
+		dst := msg.ProtoReflect().Type().New().Interface()
+
+		if err := (prototext.Unmarshal(textFormat, dst)); err != nil {
+			t.Errorf("failed to unmarshal messsage from text format: %v\ntext format: %s", err, textFormat)
+		}
+
+		// The cmp package does not deal with NaN on its own and will report
+		// NaN != NaN.
+		optNaN64 := cmp.Comparer(func(x, y float32) bool {
+			return (math.IsNaN(float64(x)) && math.IsNaN(float64(y))) || x == y
+		})
+		optNaN32 := cmp.Comparer(func(x, y float64) bool {
+			return (math.IsNaN(x) && math.IsNaN(y)) || x == y
+		})
+		if diff := cmp.Diff(src, dst, protocmp.Transform(), optNaN64, optNaN32); diff != "" {
+			t.Error(diff)
+		}
+	}
+}
+
+func FuzzEncodeDecodeRoundTrip(f *testing.F) {
+	f.Add([]byte("Hello World!"))
+	f.Fuzz(func(t *testing.T, in []byte) {
+		roundTripAndCompareProto(t, in, (*testfuzzpb.TestAllTypesProto2)(nil), (*testfuzzpb.TestAllTypesProto2Editions)(nil), (*testfuzzpb.TestAllTypesProto3)(nil), (*testfuzzpb.TestAllTypesProto3Editions)(nil))
+	})
+}
diff --git a/internal/testprotos/textpbeditions/test2.pb.go b/internal/testprotos/textpbeditions/test2.pb.go
index aae27ba2..ac7c57ab 100644
--- a/internal/testprotos/textpbeditions/test2.pb.go
+++ b/internal/testprotos/textpbeditions/test2.pb.go
@@ -72,6 +72,58 @@ func (Enum) EnumDescriptor() ([]byte, []int) {
 	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{0}
 }
 
+type OpenEnum int32
+
+const (
+	OpenEnum_UNKNOWN OpenEnum = 0
+	OpenEnum_EINS    OpenEnum = 1
+	OpenEnum_ZWEI    OpenEnum = 2
+	OpenEnum_ZEHN    OpenEnum = 10
+)
+
+// Enum value maps for OpenEnum.
+var (
+	OpenEnum_name = map[int32]string{
+		0:  "UNKNOWN",
+		1:  "EINS",
+		2:  "ZWEI",
+		10: "ZEHN",
+	}
+	OpenEnum_value = map[string]int32{
+		"UNKNOWN": 0,
+		"EINS":    1,
+		"ZWEI":    2,
+		"ZEHN":    10,
+	}
+)
+
+func (x OpenEnum) Enum() *OpenEnum {
+	p := new(OpenEnum)
+	*p = x
+	return p
+}
+
+func (x OpenEnum) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (OpenEnum) Descriptor() protoreflect.EnumDescriptor {
+	return file_internal_testprotos_textpbeditions_test2_proto_enumTypes[1].Descriptor()
+}
+
+func (OpenEnum) Type() protoreflect.EnumType {
+	return &file_internal_testprotos_textpbeditions_test2_proto_enumTypes[1]
+}
+
+func (x OpenEnum) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use OpenEnum.Descriptor instead.
+func (OpenEnum) EnumDescriptor() ([]byte, []int) {
+	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{1}
+}
+
 type Enums_NestedEnum int32
 
 const (
@@ -105,11 +157,11 @@ func (x Enums_NestedEnum) String() string {
 }
 
 func (Enums_NestedEnum) Descriptor() protoreflect.EnumDescriptor {
-	return file_internal_testprotos_textpbeditions_test2_proto_enumTypes[1].Descriptor()
+	return file_internal_testprotos_textpbeditions_test2_proto_enumTypes[2].Descriptor()
 }
 
 func (Enums_NestedEnum) Type() protoreflect.EnumType {
-	return &file_internal_testprotos_textpbeditions_test2_proto_enumTypes[1]
+	return &file_internal_testprotos_textpbeditions_test2_proto_enumTypes[2]
 }
 
 func (x Enums_NestedEnum) Number() protoreflect.EnumNumber {
@@ -118,7 +170,59 @@ func (x Enums_NestedEnum) Number() protoreflect.EnumNumber {
 
 // Deprecated: Use Enums_NestedEnum.Descriptor instead.
 func (Enums_NestedEnum) EnumDescriptor() ([]byte, []int) {
-	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{2, 0}
+	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{4, 0}
+}
+
+type Enums_NestedOpenEnum int32
+
+const (
+	Enums_UNKNOWN Enums_NestedOpenEnum = 0
+	Enums_EINS    Enums_NestedOpenEnum = 1
+	Enums_ZWEI    Enums_NestedOpenEnum = 2
+	Enums_ZEHN    Enums_NestedOpenEnum = 10
+)
+
+// Enum value maps for Enums_NestedOpenEnum.
+var (
+	Enums_NestedOpenEnum_name = map[int32]string{
+		0:  "UNKNOWN",
+		1:  "EINS",
+		2:  "ZWEI",
+		10: "ZEHN",
+	}
+	Enums_NestedOpenEnum_value = map[string]int32{
+		"UNKNOWN": 0,
+		"EINS":    1,
+		"ZWEI":    2,
+		"ZEHN":    10,
+	}
+)
+
+func (x Enums_NestedOpenEnum) Enum() *Enums_NestedOpenEnum {
+	p := new(Enums_NestedOpenEnum)
+	*p = x
+	return p
+}
+
+func (x Enums_NestedOpenEnum) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Enums_NestedOpenEnum) Descriptor() protoreflect.EnumDescriptor {
+	return file_internal_testprotos_textpbeditions_test2_proto_enumTypes[3].Descriptor()
+}
+
+func (Enums_NestedOpenEnum) Type() protoreflect.EnumType {
+	return &file_internal_testprotos_textpbeditions_test2_proto_enumTypes[3]
+}
+
+func (x Enums_NestedOpenEnum) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use Enums_NestedOpenEnum.Descriptor instead.
+func (Enums_NestedOpenEnum) EnumDescriptor() ([]byte, []int) {
+	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{4, 1}
 }
 
 // Scalars contains scalar fields.
@@ -441,22 +545,118 @@ func (x *ImplicitScalars) GetSString() string {
 	return ""
 }
 
+type UTF8Validated struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ValidatedString string `protobuf:"bytes,1,opt,name=validated_string,json=validatedString" json:"validated_string,omitempty"`
+}
+
+func (x *UTF8Validated) Reset() {
+	*x = UTF8Validated{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *UTF8Validated) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UTF8Validated) ProtoMessage() {}
+
+func (x *UTF8Validated) ProtoReflect() protoreflect.Message {
+	mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use UTF8Validated.ProtoReflect.Descriptor instead.
+func (*UTF8Validated) Descriptor() ([]byte, []int) {
+	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *UTF8Validated) GetValidatedString() string {
+	if x != nil {
+		return x.ValidatedString
+	}
+	return ""
+}
+
+type NestsUTF8Validated struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ValidatedMessage *UTF8Validated `protobuf:"bytes,1,opt,name=validated_message,json=validatedMessage" json:"validated_message,omitempty"`
+}
+
+func (x *NestsUTF8Validated) Reset() {
+	*x = NestsUTF8Validated{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *NestsUTF8Validated) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*NestsUTF8Validated) ProtoMessage() {}
+
+func (x *NestsUTF8Validated) ProtoReflect() protoreflect.Message {
+	mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use NestsUTF8Validated.ProtoReflect.Descriptor instead.
+func (*NestsUTF8Validated) Descriptor() ([]byte, []int) {
+	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *NestsUTF8Validated) GetValidatedMessage() *UTF8Validated {
+	if x != nil {
+		return x.ValidatedMessage
+	}
+	return nil
+}
+
 // Message contains enum fields.
 type Enums struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	OptEnum       *Enum              `protobuf:"varint,1,opt,name=opt_enum,json=optEnum,enum=pbeditions.Enum" json:"opt_enum,omitempty"`
-	RptEnum       []Enum             `protobuf:"varint,2,rep,packed,name=rpt_enum,json=rptEnum,enum=pbeditions.Enum" json:"rpt_enum,omitempty"`
-	OptNestedEnum *Enums_NestedEnum  `protobuf:"varint,3,opt,name=opt_nested_enum,json=optNestedEnum,enum=pbeditions.Enums_NestedEnum" json:"opt_nested_enum,omitempty"`
-	RptNestedEnum []Enums_NestedEnum `protobuf:"varint,4,rep,packed,name=rpt_nested_enum,json=rptNestedEnum,enum=pbeditions.Enums_NestedEnum" json:"rpt_nested_enum,omitempty"`
+	OptEnum            *Enum                `protobuf:"varint,1,opt,name=opt_enum,json=optEnum,enum=pbeditions.Enum" json:"opt_enum,omitempty"`
+	RptEnum            []Enum               `protobuf:"varint,2,rep,packed,name=rpt_enum,json=rptEnum,enum=pbeditions.Enum" json:"rpt_enum,omitempty"`
+	ImplicitEnum       OpenEnum             `protobuf:"varint,5,opt,name=implicit_enum,json=implicitEnum,enum=pbeditions.OpenEnum" json:"implicit_enum,omitempty"`
+	OptNestedEnum      *Enums_NestedEnum    `protobuf:"varint,3,opt,name=opt_nested_enum,json=optNestedEnum,enum=pbeditions.Enums_NestedEnum" json:"opt_nested_enum,omitempty"`
+	RptNestedEnum      []Enums_NestedEnum   `protobuf:"varint,4,rep,packed,name=rpt_nested_enum,json=rptNestedEnum,enum=pbeditions.Enums_NestedEnum" json:"rpt_nested_enum,omitempty"`
+	ImplicitNestedEnum Enums_NestedOpenEnum `protobuf:"varint,6,opt,name=implicit_nested_enum,json=implicitNestedEnum,enum=pbeditions.Enums_NestedOpenEnum" json:"implicit_nested_enum,omitempty"`
 }
 
 func (x *Enums) Reset() {
 	*x = Enums{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[2]
+		mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[4]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -469,7 +669,7 @@ func (x *Enums) String() string {
 func (*Enums) ProtoMessage() {}
 
 func (x *Enums) ProtoReflect() protoreflect.Message {
-	mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[2]
+	mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[4]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -482,7 +682,7 @@ func (x *Enums) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use Enums.ProtoReflect.Descriptor instead.
 func (*Enums) Descriptor() ([]byte, []int) {
-	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{2}
+	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{4}
 }
 
 func (x *Enums) GetOptEnum() Enum {
@@ -499,6 +699,13 @@ func (x *Enums) GetRptEnum() []Enum {
 	return nil
 }
 
+func (x *Enums) GetImplicitEnum() OpenEnum {
+	if x != nil {
+		return x.ImplicitEnum
+	}
+	return OpenEnum_UNKNOWN
+}
+
 func (x *Enums) GetOptNestedEnum() Enums_NestedEnum {
 	if x != nil && x.OptNestedEnum != nil {
 		return *x.OptNestedEnum
@@ -513,6 +720,13 @@ func (x *Enums) GetRptNestedEnum() []Enums_NestedEnum {
 	return nil
 }
 
+func (x *Enums) GetImplicitNestedEnum() Enums_NestedOpenEnum {
+	if x != nil {
+		return x.ImplicitNestedEnum
+	}
+	return Enums_UNKNOWN
+}
+
 // Message contains repeated fields.
 type Repeats struct {
 	state         protoimpl.MessageState
@@ -533,7 +747,7 @@ type Repeats struct {
 func (x *Repeats) Reset() {
 	*x = Repeats{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[3]
+		mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[5]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -546,7 +760,7 @@ func (x *Repeats) String() string {
 func (*Repeats) ProtoMessage() {}
 
 func (x *Repeats) ProtoReflect() protoreflect.Message {
-	mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[3]
+	mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[5]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -559,7 +773,7 @@ func (x *Repeats) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use Repeats.ProtoReflect.Descriptor instead.
 func (*Repeats) Descriptor() ([]byte, []int) {
-	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{3}
+	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{5}
 }
 
 func (x *Repeats) GetRptBool() []bool {
@@ -638,7 +852,7 @@ type Maps struct {
 func (x *Maps) Reset() {
 	*x = Maps{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[4]
+		mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[6]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -651,7 +865,7 @@ func (x *Maps) String() string {
 func (*Maps) ProtoMessage() {}
 
 func (x *Maps) ProtoReflect() protoreflect.Message {
-	mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[4]
+	mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[6]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -664,7 +878,7 @@ func (x *Maps) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use Maps.ProtoReflect.Descriptor instead.
 func (*Maps) Descriptor() ([]byte, []int) {
-	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{4}
+	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{6}
 }
 
 func (x *Maps) GetInt32ToStr() map[int32]string {
@@ -694,7 +908,7 @@ type Nested struct {
 func (x *Nested) Reset() {
 	*x = Nested{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[5]
+		mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[7]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -707,7 +921,7 @@ func (x *Nested) String() string {
 func (*Nested) ProtoMessage() {}
 
 func (x *Nested) ProtoReflect() protoreflect.Message {
-	mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[5]
+	mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[7]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -720,7 +934,7 @@ func (x *Nested) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use Nested.ProtoReflect.Descriptor instead.
 func (*Nested) Descriptor() ([]byte, []int) {
-	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{5}
+	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{7}
 }
 
 func (x *Nested) GetOptString() string {
@@ -752,7 +966,7 @@ type Nests struct {
 func (x *Nests) Reset() {
 	*x = Nests{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[6]
+		mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[8]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -765,7 +979,7 @@ func (x *Nests) String() string {
 func (*Nests) ProtoMessage() {}
 
 func (x *Nests) ProtoReflect() protoreflect.Message {
-	mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[6]
+	mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[8]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -778,7 +992,7 @@ func (x *Nests) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use Nests.ProtoReflect.Descriptor instead.
 func (*Nests) Descriptor() ([]byte, []int) {
-	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{6}
+	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{8}
 }
 
 func (x *Nests) GetOptNested() *Nested {
@@ -826,7 +1040,7 @@ type Requireds struct {
 func (x *Requireds) Reset() {
 	*x = Requireds{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[7]
+		mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[9]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -839,7 +1053,7 @@ func (x *Requireds) String() string {
 func (*Requireds) ProtoMessage() {}
 
 func (x *Requireds) ProtoReflect() protoreflect.Message {
-	mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[7]
+	mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[9]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -852,7 +1066,7 @@ func (x *Requireds) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use Requireds.ProtoReflect.Descriptor instead.
 func (*Requireds) Descriptor() ([]byte, []int) {
-	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{7}
+	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{9}
 }
 
 func (x *Requireds) GetReqBool() bool {
@@ -910,7 +1124,7 @@ type PartialRequired struct {
 func (x *PartialRequired) Reset() {
 	*x = PartialRequired{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[8]
+		mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[10]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -923,7 +1137,7 @@ func (x *PartialRequired) String() string {
 func (*PartialRequired) ProtoMessage() {}
 
 func (x *PartialRequired) ProtoReflect() protoreflect.Message {
-	mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[8]
+	mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[10]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -936,7 +1150,7 @@ func (x *PartialRequired) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use PartialRequired.ProtoReflect.Descriptor instead.
 func (*PartialRequired) Descriptor() ([]byte, []int) {
-	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{8}
+	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{10}
 }
 
 func (x *PartialRequired) GetReqString() string {
@@ -964,7 +1178,7 @@ type NestedWithRequired struct {
 func (x *NestedWithRequired) Reset() {
 	*x = NestedWithRequired{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[9]
+		mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[11]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -977,7 +1191,7 @@ func (x *NestedWithRequired) String() string {
 func (*NestedWithRequired) ProtoMessage() {}
 
 func (x *NestedWithRequired) ProtoReflect() protoreflect.Message {
-	mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[9]
+	mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[11]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -990,7 +1204,7 @@ func (x *NestedWithRequired) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use NestedWithRequired.ProtoReflect.Descriptor instead.
 func (*NestedWithRequired) Descriptor() ([]byte, []int) {
-	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{9}
+	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{11}
 }
 
 func (x *NestedWithRequired) GetReqString() string {
@@ -1017,7 +1231,7 @@ type IndirectRequired struct {
 func (x *IndirectRequired) Reset() {
 	*x = IndirectRequired{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[10]
+		mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[12]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1030,7 +1244,7 @@ func (x *IndirectRequired) String() string {
 func (*IndirectRequired) ProtoMessage() {}
 
 func (x *IndirectRequired) ProtoReflect() protoreflect.Message {
-	mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[10]
+	mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[12]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1043,7 +1257,7 @@ func (x *IndirectRequired) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use IndirectRequired.ProtoReflect.Descriptor instead.
 func (*IndirectRequired) Descriptor() ([]byte, []int) {
-	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{10}
+	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{12}
 }
 
 func (x *IndirectRequired) GetOptNested() *NestedWithRequired {
@@ -1105,7 +1319,7 @@ type Extensions struct {
 func (x *Extensions) Reset() {
 	*x = Extensions{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[11]
+		mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[13]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1118,7 +1332,7 @@ func (x *Extensions) String() string {
 func (*Extensions) ProtoMessage() {}
 
 func (x *Extensions) ProtoReflect() protoreflect.Message {
-	mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[11]
+	mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[13]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1131,7 +1345,7 @@ func (x *Extensions) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use Extensions.ProtoReflect.Descriptor instead.
 func (*Extensions) Descriptor() ([]byte, []int) {
-	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{11}
+	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{13}
 }
 
 func (x *Extensions) GetOptString() string {
@@ -1164,7 +1378,7 @@ type ExtensionsContainer struct {
 func (x *ExtensionsContainer) Reset() {
 	*x = ExtensionsContainer{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[12]
+		mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[14]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1177,7 +1391,7 @@ func (x *ExtensionsContainer) String() string {
 func (*ExtensionsContainer) ProtoMessage() {}
 
 func (x *ExtensionsContainer) ProtoReflect() protoreflect.Message {
-	mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[12]
+	mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[14]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1190,7 +1404,7 @@ func (x *ExtensionsContainer) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ExtensionsContainer.ProtoReflect.Descriptor instead.
 func (*ExtensionsContainer) Descriptor() ([]byte, []int) {
-	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{12}
+	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{14}
 }
 
 type MessageSet struct {
@@ -1203,7 +1417,7 @@ type MessageSet struct {
 func (x *MessageSet) Reset() {
 	*x = MessageSet{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[13]
+		mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[15]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1216,7 +1430,7 @@ func (x *MessageSet) String() string {
 func (*MessageSet) ProtoMessage() {}
 
 func (x *MessageSet) ProtoReflect() protoreflect.Message {
-	mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[13]
+	mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[15]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1229,7 +1443,7 @@ func (x *MessageSet) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use MessageSet.ProtoReflect.Descriptor instead.
 func (*MessageSet) Descriptor() ([]byte, []int) {
-	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{13}
+	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{15}
 }
 
 type MessageSetExtension struct {
@@ -1243,7 +1457,7 @@ type MessageSetExtension struct {
 func (x *MessageSetExtension) Reset() {
 	*x = MessageSetExtension{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[14]
+		mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[16]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1256,7 +1470,7 @@ func (x *MessageSetExtension) String() string {
 func (*MessageSetExtension) ProtoMessage() {}
 
 func (x *MessageSetExtension) ProtoReflect() protoreflect.Message {
-	mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[14]
+	mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[16]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1269,7 +1483,7 @@ func (x *MessageSetExtension) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use MessageSetExtension.ProtoReflect.Descriptor instead.
 func (*MessageSetExtension) Descriptor() ([]byte, []int) {
-	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{14}
+	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{16}
 }
 
 func (x *MessageSetExtension) GetOptString() string {
@@ -1289,7 +1503,7 @@ type FakeMessageSet struct {
 func (x *FakeMessageSet) Reset() {
 	*x = FakeMessageSet{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[15]
+		mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[17]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1302,7 +1516,7 @@ func (x *FakeMessageSet) String() string {
 func (*FakeMessageSet) ProtoMessage() {}
 
 func (x *FakeMessageSet) ProtoReflect() protoreflect.Message {
-	mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[15]
+	mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[17]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1315,7 +1529,7 @@ func (x *FakeMessageSet) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use FakeMessageSet.ProtoReflect.Descriptor instead.
 func (*FakeMessageSet) Descriptor() ([]byte, []int) {
-	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{15}
+	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{17}
 }
 
 type FakeMessageSetExtension struct {
@@ -1329,7 +1543,7 @@ type FakeMessageSetExtension struct {
 func (x *FakeMessageSetExtension) Reset() {
 	*x = FakeMessageSetExtension{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[16]
+		mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[18]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1342,7 +1556,7 @@ func (x *FakeMessageSetExtension) String() string {
 func (*FakeMessageSetExtension) ProtoMessage() {}
 
 func (x *FakeMessageSetExtension) ProtoReflect() protoreflect.Message {
-	mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[16]
+	mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[18]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1355,7 +1569,7 @@ func (x *FakeMessageSetExtension) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use FakeMessageSetExtension.ProtoReflect.Descriptor instead.
 func (*FakeMessageSetExtension) Descriptor() ([]byte, []int) {
-	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{16}
+	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{18}
 }
 
 func (x *FakeMessageSetExtension) GetOptString() string {
@@ -1394,7 +1608,7 @@ type KnownTypes struct {
 func (x *KnownTypes) Reset() {
 	*x = KnownTypes{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[17]
+		mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[19]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1407,7 +1621,7 @@ func (x *KnownTypes) String() string {
 func (*KnownTypes) ProtoMessage() {}
 
 func (x *KnownTypes) ProtoReflect() protoreflect.Message {
-	mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[17]
+	mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[19]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1420,7 +1634,7 @@ func (x *KnownTypes) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use KnownTypes.ProtoReflect.Descriptor instead.
 func (*KnownTypes) Descriptor() ([]byte, []int) {
-	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{17}
+	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{19}
 }
 
 func (x *KnownTypes) GetOptBool() *wrapperspb.BoolValue {
@@ -1562,7 +1776,7 @@ type Nests_OptGroup struct {
 func (x *Nests_OptGroup) Reset() {
 	*x = Nests_OptGroup{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[20]
+		mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[22]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1575,7 +1789,7 @@ func (x *Nests_OptGroup) String() string {
 func (*Nests_OptGroup) ProtoMessage() {}
 
 func (x *Nests_OptGroup) ProtoReflect() protoreflect.Message {
-	mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[20]
+	mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[22]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1588,7 +1802,7 @@ func (x *Nests_OptGroup) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use Nests_OptGroup.ProtoReflect.Descriptor instead.
 func (*Nests_OptGroup) Descriptor() ([]byte, []int) {
-	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{6, 0}
+	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{8, 0}
 }
 
 func (x *Nests_OptGroup) GetOptString() string {
@@ -1623,7 +1837,7 @@ type Nests_RptGroup struct {
 func (x *Nests_RptGroup) Reset() {
 	*x = Nests_RptGroup{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[21]
+		mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[23]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1636,7 +1850,7 @@ func (x *Nests_RptGroup) String() string {
 func (*Nests_RptGroup) ProtoMessage() {}
 
 func (x *Nests_RptGroup) ProtoReflect() protoreflect.Message {
-	mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[21]
+	mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[23]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1649,7 +1863,7 @@ func (x *Nests_RptGroup) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use Nests_RptGroup.ProtoReflect.Descriptor instead.
 func (*Nests_RptGroup) Descriptor() ([]byte, []int) {
-	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{6, 1}
+	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{8, 1}
 }
 
 func (x *Nests_RptGroup) GetRptString() []string {
@@ -1670,7 +1884,7 @@ type Nests_OptGroup_OptNestedGroup struct {
 func (x *Nests_OptGroup_OptNestedGroup) Reset() {
 	*x = Nests_OptGroup_OptNestedGroup{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[22]
+		mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[24]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1683,7 +1897,7 @@ func (x *Nests_OptGroup_OptNestedGroup) String() string {
 func (*Nests_OptGroup_OptNestedGroup) ProtoMessage() {}
 
 func (x *Nests_OptGroup_OptNestedGroup) ProtoReflect() protoreflect.Message {
-	mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[22]
+	mi := &file_internal_testprotos_textpbeditions_test2_proto_msgTypes[24]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1696,7 +1910,7 @@ func (x *Nests_OptGroup_OptNestedGroup) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use Nests_OptGroup_OptNestedGroup.ProtoReflect.Descriptor instead.
 func (*Nests_OptGroup_OptNestedGroup) Descriptor() ([]byte, []int) {
-	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{6, 0, 0}
+	return file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP(), []int{8, 0, 0}
 }
 
 func (x *Nests_OptGroup_OptNestedGroup) GetOptFixed32() uint32 {
@@ -2014,302 +2228,330 @@ var file_internal_testprotos_textpbeditions_test2_proto_rawDesc = []byte{
 	0x01, 0x28, 0x0c, 0x42, 0x05, 0xaa, 0x01, 0x02, 0x08, 0x02, 0x52, 0x06, 0x73, 0x42, 0x79, 0x74,
 	0x65, 0x73, 0x12, 0x20, 0x0a, 0x08, 0x73, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x0d,
 	0x20, 0x01, 0x28, 0x09, 0x42, 0x05, 0xaa, 0x01, 0x02, 0x08, 0x02, 0x52, 0x07, 0x73, 0x53, 0x74,
-	0x72, 0x69, 0x6e, 0x67, 0x22, 0x97, 0x02, 0x0a, 0x05, 0x45, 0x6e, 0x75, 0x6d, 0x73, 0x12, 0x2b,
-	0x0a, 0x08, 0x6f, 0x70, 0x74, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e,
+	0x72, 0x69, 0x6e, 0x67, 0x22, 0x43, 0x0a, 0x0d, 0x55, 0x54, 0x46, 0x38, 0x56, 0x61, 0x6c, 0x69,
+	0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x10, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74,
+	0x65, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42,
+	0x07, 0xaa, 0x01, 0x04, 0x08, 0x02, 0x20, 0x02, 0x52, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61,
+	0x74, 0x65, 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x5c, 0x0a, 0x12, 0x4e, 0x65, 0x73,
+	0x74, 0x73, 0x55, 0x54, 0x46, 0x38, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12,
+	0x46, 0x0a, 0x11, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73,
+	0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x62, 0x65,
+	0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x55, 0x54, 0x46, 0x38, 0x56, 0x61, 0x6c, 0x69,
+	0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x10, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64,
+	0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xf7, 0x03, 0x0a, 0x05, 0x45, 0x6e, 0x75, 0x6d,
+	0x73, 0x12, 0x2b, 0x0a, 0x08, 0x6f, 0x70, 0x74, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+	0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x2b,
+	0x0a, 0x08, 0x72, 0x70, 0x74, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e,
 	0x32, 0x10, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x6e,
-	0x75, 0x6d, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x2b, 0x0a, 0x08, 0x72,
-	0x70, 0x74, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x10, 0x2e,
-	0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x52,
-	0x07, 0x72, 0x70, 0x74, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x44, 0x0a, 0x0f, 0x6f, 0x70, 0x74, 0x5f,
-	0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28,
-	0x0e, 0x32, 0x1c, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45,
-	0x6e, 0x75, 0x6d, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x75, 0x6d, 0x52,
-	0x0d, 0x6f, 0x70, 0x74, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x44,
-	0x0a, 0x0f, 0x72, 0x70, 0x74, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x65, 0x6e, 0x75,
-	0x6d, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74,
+	0x75, 0x6d, 0x52, 0x07, 0x72, 0x70, 0x74, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x40, 0x0a, 0x0d, 0x69,
+	0x6d, 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x05, 0x20, 0x01,
+	0x28, 0x0e, 0x32, 0x14, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e,
+	0x4f, 0x70, 0x65, 0x6e, 0x45, 0x6e, 0x75, 0x6d, 0x42, 0x05, 0xaa, 0x01, 0x02, 0x08, 0x02, 0x52,
+	0x0c, 0x69, 0x6d, 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x44, 0x0a,
+	0x0f, 0x6f, 0x70, 0x74, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x65, 0x6e, 0x75, 0x6d,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69,
+	0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64,
+	0x45, 0x6e, 0x75, 0x6d, 0x52, 0x0d, 0x6f, 0x70, 0x74, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x45,
+	0x6e, 0x75, 0x6d, 0x12, 0x44, 0x0a, 0x0f, 0x72, 0x70, 0x74, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65,
+	0x64, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x70,
+	0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x73, 0x2e,
+	0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x0d, 0x72, 0x70, 0x74, 0x4e,
+	0x65, 0x73, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x59, 0x0a, 0x14, 0x69, 0x6d, 0x70,
+	0x6c, 0x69, 0x63, 0x69, 0x74, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x65, 0x6e, 0x75,
+	0x6d, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74,
 	0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65,
-	0x64, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x0d, 0x72, 0x70, 0x74, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64,
+	0x64, 0x4f, 0x70, 0x65, 0x6e, 0x45, 0x6e, 0x75, 0x6d, 0x42, 0x05, 0xaa, 0x01, 0x02, 0x08, 0x02,
+	0x52, 0x12, 0x69, 0x6d, 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64,
 	0x45, 0x6e, 0x75, 0x6d, 0x22, 0x28, 0x0a, 0x0a, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x45, 0x6e,
 	0x75, 0x6d, 0x12, 0x07, 0x0a, 0x03, 0x55, 0x4e, 0x4f, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x44,
-	0x4f, 0x53, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x49, 0x45, 0x5a, 0x10, 0x0a, 0x22, 0x94,
-	0x02, 0x0a, 0x07, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x70,
-	0x74, 0x5f, 0x62, 0x6f, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x03, 0x28, 0x08, 0x52, 0x07, 0x72, 0x70,
-	0x74, 0x42, 0x6f, 0x6f, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x70, 0x74, 0x5f, 0x69, 0x6e, 0x74,
-	0x33, 0x32, 0x18, 0x02, 0x20, 0x03, 0x28, 0x05, 0x52, 0x08, 0x72, 0x70, 0x74, 0x49, 0x6e, 0x74,
-	0x33, 0x32, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x70, 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x18,
-	0x03, 0x20, 0x03, 0x28, 0x03, 0x52, 0x08, 0x72, 0x70, 0x74, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x12,
-	0x1d, 0x0a, 0x0a, 0x72, 0x70, 0x74, 0x5f, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x04, 0x20,
-	0x03, 0x28, 0x0d, 0x52, 0x09, 0x72, 0x70, 0x74, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x12, 0x1d,
-	0x0a, 0x0a, 0x72, 0x70, 0x74, 0x5f, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x18, 0x05, 0x20, 0x03,
-	0x28, 0x04, 0x52, 0x09, 0x72, 0x70, 0x74, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x1b, 0x0a,
-	0x09, 0x72, 0x70, 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x03, 0x28, 0x02,
-	0x52, 0x08, 0x72, 0x70, 0x74, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x70,
-	0x74, 0x5f, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x03, 0x28, 0x01, 0x52, 0x09,
-	0x72, 0x70, 0x74, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x70, 0x74,
-	0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72,
-	0x70, 0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x70, 0x74, 0x5f,
-	0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x08, 0x72, 0x70, 0x74,
-	0x42, 0x79, 0x74, 0x65, 0x73, 0x22, 0xa4, 0x02, 0x0a, 0x04, 0x4d, 0x61, 0x70, 0x73, 0x12, 0x42,
-	0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x72, 0x18, 0x01,
-	0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e,
-	0x73, 0x2e, 0x4d, 0x61, 0x70, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x54, 0x6f, 0x53, 0x74,
-	0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x54, 0x6f, 0x53,
-	0x74, 0x72, 0x12, 0x45, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x5f, 0x74, 0x6f, 0x5f, 0x6e, 0x65, 0x73,
-	0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x62, 0x65, 0x64,
-	0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4d, 0x61, 0x70, 0x73, 0x2e, 0x53, 0x74, 0x72, 0x54,
-	0x6f, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x73, 0x74,
-	0x72, 0x54, 0x6f, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x1a, 0x3d, 0x0a, 0x0f, 0x49, 0x6e, 0x74,
-	0x33, 0x32, 0x54, 0x6f, 0x53, 0x74, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03,
-	0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14,
-	0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76,
-	0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x52, 0x0a, 0x10, 0x53, 0x74, 0x72, 0x54,
-	0x6f, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03,
-	0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x28,
-	0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e,
-	0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65,
-	0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x5a, 0x0a, 0x06,
-	0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x70, 0x74, 0x5f, 0x73, 0x74,
-	0x72, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x70, 0x74, 0x53,
-	0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x31, 0x0a, 0x0a, 0x6f, 0x70, 0x74, 0x5f, 0x6e, 0x65, 0x73,
-	0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x62, 0x65, 0x64,
+	0x4f, 0x53, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x49, 0x45, 0x5a, 0x10, 0x0a, 0x22, 0x41,
+	0x0a, 0x0e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x6e, 0x45, 0x6e, 0x75, 0x6d,
+	0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x08, 0x0a,
+	0x04, 0x45, 0x49, 0x4e, 0x53, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x5a, 0x57, 0x45, 0x49, 0x10,
+	0x02, 0x12, 0x08, 0x0a, 0x04, 0x5a, 0x45, 0x48, 0x4e, 0x10, 0x0a, 0x1a, 0x04, 0x3a, 0x02, 0x10,
+	0x01, 0x22, 0x94, 0x02, 0x0a, 0x07, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x73, 0x12, 0x19, 0x0a,
+	0x08, 0x72, 0x70, 0x74, 0x5f, 0x62, 0x6f, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x03, 0x28, 0x08, 0x52,
+	0x07, 0x72, 0x70, 0x74, 0x42, 0x6f, 0x6f, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x70, 0x74, 0x5f,
+	0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x02, 0x20, 0x03, 0x28, 0x05, 0x52, 0x08, 0x72, 0x70, 0x74,
+	0x49, 0x6e, 0x74, 0x33, 0x32, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x70, 0x74, 0x5f, 0x69, 0x6e, 0x74,
+	0x36, 0x34, 0x18, 0x03, 0x20, 0x03, 0x28, 0x03, 0x52, 0x08, 0x72, 0x70, 0x74, 0x49, 0x6e, 0x74,
+	0x36, 0x34, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x70, 0x74, 0x5f, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32,
+	0x18, 0x04, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x09, 0x72, 0x70, 0x74, 0x55, 0x69, 0x6e, 0x74, 0x33,
+	0x32, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x70, 0x74, 0x5f, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x18,
+	0x05, 0x20, 0x03, 0x28, 0x04, 0x52, 0x09, 0x72, 0x70, 0x74, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34,
+	0x12, 0x1b, 0x0a, 0x09, 0x72, 0x70, 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x18, 0x06, 0x20,
+	0x03, 0x28, 0x02, 0x52, 0x08, 0x72, 0x70, 0x74, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x12, 0x1d, 0x0a,
+	0x0a, 0x72, 0x70, 0x74, 0x5f, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x03, 0x28,
+	0x01, 0x52, 0x09, 0x72, 0x70, 0x74, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x0a,
+	0x72, 0x70, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09,
+	0x52, 0x09, 0x72, 0x70, 0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x1b, 0x0a, 0x09, 0x72,
+	0x70, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x08,
+	0x72, 0x70, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x22, 0xa4, 0x02, 0x0a, 0x04, 0x4d, 0x61, 0x70,
+	0x73, 0x12, 0x42, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x6f, 0x5f, 0x73, 0x74,
+	0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74,
+	0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4d, 0x61, 0x70, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x54,
+	0x6f, 0x53, 0x74, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x33, 0x32,
+	0x54, 0x6f, 0x53, 0x74, 0x72, 0x12, 0x45, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x5f, 0x74, 0x6f, 0x5f,
+	0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70,
+	0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4d, 0x61, 0x70, 0x73, 0x2e, 0x53,
+	0x74, 0x72, 0x54, 0x6f, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52,
+	0x0b, 0x73, 0x74, 0x72, 0x54, 0x6f, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x1a, 0x3d, 0x0a, 0x0f,
+	0x49, 0x6e, 0x74, 0x33, 0x32, 0x54, 0x6f, 0x53, 0x74, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12,
+	0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65,
+	0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x52, 0x0a, 0x10, 0x53,
+	0x74, 0x72, 0x54, 0x6f, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12,
+	0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65,
+	0x79, 0x12, 0x28, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x12, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4e, 0x65,
+	0x73, 0x74, 0x65, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22,
+	0x5a, 0x0a, 0x06, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x70, 0x74,
+	0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f,
+	0x70, 0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x31, 0x0a, 0x0a, 0x6f, 0x70, 0x74, 0x5f,
+	0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70,
+	0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64,
+	0x52, 0x09, 0x6f, 0x70, 0x74, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x22, 0x94, 0x04, 0x0a, 0x05,
+	0x4e, 0x65, 0x73, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x0a, 0x6f, 0x70, 0x74, 0x5f, 0x6e, 0x65, 0x73,
+	0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x62, 0x65, 0x64,
 	0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x52, 0x09, 0x6f,
-	0x70, 0x74, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x22, 0x94, 0x04, 0x0a, 0x05, 0x4e, 0x65, 0x73,
-	0x74, 0x73, 0x12, 0x31, 0x0a, 0x0a, 0x6f, 0x70, 0x74, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64,
-	0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69,
-	0x6f, 0x6e, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x52, 0x09, 0x6f, 0x70, 0x74, 0x4e,
-	0x65, 0x73, 0x74, 0x65, 0x64, 0x12, 0x3d, 0x0a, 0x08, 0x6f, 0x70, 0x74, 0x67, 0x72, 0x6f, 0x75,
-	0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74,
-	0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x4f, 0x70, 0x74, 0x47, 0x72,
-	0x6f, 0x75, 0x70, 0x42, 0x05, 0xaa, 0x01, 0x02, 0x28, 0x02, 0x52, 0x08, 0x6f, 0x70, 0x74, 0x67,
-	0x72, 0x6f, 0x75, 0x70, 0x12, 0x31, 0x0a, 0x0a, 0x72, 0x70, 0x74, 0x5f, 0x6e, 0x65, 0x73, 0x74,
-	0x65, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69,
-	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x52, 0x09, 0x72, 0x70,
-	0x74, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, 0x3f, 0x0a, 0x08, 0x72, 0x70, 0x74, 0x67, 0x72,
-	0x6f, 0x75, 0x70, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x62, 0x65, 0x64,
-	0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x52, 0x70, 0x74,
-	0x47, 0x72, 0x6f, 0x75, 0x70, 0x42, 0x07, 0xaa, 0x01, 0x04, 0x18, 0x02, 0x28, 0x02, 0x52, 0x08,
-	0x72, 0x70, 0x74, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x1a, 0xe9, 0x01, 0x0a, 0x08, 0x4f, 0x70, 0x74,
-	0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x70, 0x74, 0x5f, 0x73, 0x74, 0x72,
-	0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x70, 0x74, 0x53, 0x74,
-	0x72, 0x69, 0x6e, 0x67, 0x12, 0x31, 0x0a, 0x0a, 0x6f, 0x70, 0x74, 0x5f, 0x6e, 0x65, 0x73, 0x74,
-	0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69,
-	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x52, 0x09, 0x6f, 0x70,
-	0x74, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, 0x58, 0x0a, 0x0e, 0x6f, 0x70, 0x74, 0x6e, 0x65,
-	0x73, 0x74, 0x65, 0x64, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32,
-	0x29, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4e, 0x65, 0x73,
-	0x74, 0x73, 0x2e, 0x4f, 0x70, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x4f, 0x70, 0x74, 0x4e,
-	0x65, 0x73, 0x74, 0x65, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x42, 0x05, 0xaa, 0x01, 0x02, 0x28,
-	0x02, 0x52, 0x0e, 0x6f, 0x70, 0x74, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x67, 0x72, 0x6f, 0x75,
-	0x70, 0x1a, 0x31, 0x0a, 0x0e, 0x4f, 0x70, 0x74, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x47, 0x72,
-	0x6f, 0x75, 0x70, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x70, 0x74, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64,
-	0x33, 0x32, 0x18, 0x01, 0x20, 0x01, 0x28, 0x07, 0x52, 0x0a, 0x6f, 0x70, 0x74, 0x46, 0x69, 0x78,
-	0x65, 0x64, 0x33, 0x32, 0x1a, 0x29, 0x0a, 0x08, 0x52, 0x70, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70,
-	0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x70, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x01,
-	0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x70, 0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52,
-	0x0e, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x22,
-	0x91, 0x02, 0x0a, 0x09, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x73, 0x12, 0x20, 0x0a,
-	0x08, 0x72, 0x65, 0x71, 0x5f, 0x62, 0x6f, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x42,
-	0x05, 0xaa, 0x01, 0x02, 0x08, 0x03, 0x52, 0x07, 0x72, 0x65, 0x71, 0x42, 0x6f, 0x6f, 0x6c, 0x12,
-	0x28, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x5f, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x18,
-	0x02, 0x20, 0x01, 0x28, 0x10, 0x42, 0x05, 0xaa, 0x01, 0x02, 0x08, 0x03, 0x52, 0x0b, 0x72, 0x65,
-	0x71, 0x53, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x12, 0x24, 0x0a, 0x0a, 0x72, 0x65, 0x71,
-	0x5f, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x42, 0x05, 0xaa,
-	0x01, 0x02, 0x08, 0x03, 0x52, 0x09, 0x72, 0x65, 0x71, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x12,
-	0x24, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20,
-	0x01, 0x28, 0x09, 0x42, 0x05, 0xaa, 0x01, 0x02, 0x08, 0x03, 0x52, 0x09, 0x72, 0x65, 0x71, 0x53,
-	0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x32, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x5f, 0x65, 0x6e, 0x75,
-	0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74,
-	0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x42, 0x05, 0xaa, 0x01, 0x02, 0x08, 0x03,
-	0x52, 0x07, 0x72, 0x65, 0x71, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x71,
-	0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e,
-	0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65,
-	0x64, 0x42, 0x05, 0xaa, 0x01, 0x02, 0x08, 0x03, 0x52, 0x09, 0x72, 0x65, 0x71, 0x4e, 0x65, 0x73,
-	0x74, 0x65, 0x64, 0x22, 0x56, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65,
-	0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x24, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x5f, 0x73, 0x74,
-	0x72, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x05, 0xaa, 0x01, 0x02, 0x08,
-	0x03, 0x52, 0x09, 0x72, 0x65, 0x71, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x1d, 0x0a, 0x0a,
-	0x6f, 0x70, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x09, 0x6f, 0x70, 0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x3a, 0x0a, 0x12, 0x4e,
-	0x65, 0x73, 0x74, 0x65, 0x64, 0x57, 0x69, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65,
-	0x64, 0x12, 0x24, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18,
-	0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x05, 0xaa, 0x01, 0x02, 0x08, 0x03, 0x52, 0x09, 0x72, 0x65,
-	0x71, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x98, 0x03, 0x0a, 0x10, 0x49, 0x6e, 0x64, 0x69,
-	0x72, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x44, 0x0a, 0x0a,
-	0x6f, 0x70, 0x74, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
-	0x32, 0x1e, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4e, 0x65,
-	0x73, 0x74, 0x65, 0x64, 0x57, 0x69, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64,
-	0x42, 0x05, 0xaa, 0x01, 0x02, 0x08, 0x03, 0x52, 0x09, 0x6f, 0x70, 0x74, 0x4e, 0x65, 0x73, 0x74,
-	0x65, 0x64, 0x12, 0x3d, 0x0a, 0x0a, 0x72, 0x70, 0x74, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64,
-	0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69,
-	0x6f, 0x6e, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x57, 0x69, 0x74, 0x68, 0x52, 0x65,
-	0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x52, 0x09, 0x72, 0x70, 0x74, 0x4e, 0x65, 0x73, 0x74, 0x65,
-	0x64, 0x12, 0x51, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x5f, 0x74, 0x6f, 0x5f, 0x6e, 0x65, 0x73, 0x74,
-	0x65, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69,
-	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x49, 0x6e, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x52, 0x65,
-	0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x2e, 0x53, 0x74, 0x72, 0x54, 0x6f, 0x4e, 0x65, 0x73, 0x74,
-	0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x54, 0x6f, 0x4e, 0x65,
-	0x73, 0x74, 0x65, 0x64, 0x12, 0x43, 0x0a, 0x0c, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x5f, 0x6e, 0x65,
-	0x73, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x62, 0x65,
-	0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x57, 0x69,
-	0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x48, 0x00, 0x52, 0x0b, 0x6f, 0x6e,
-	0x65, 0x6f, 0x66, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x1a, 0x5e, 0x0a, 0x10, 0x53, 0x74, 0x72,
-	0x54, 0x6f, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a,
-	0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12,
-	0x34, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e,
-	0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74,
-	0x65, 0x64, 0x57, 0x69, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x52, 0x05,
-	0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x75, 0x6e, 0x69,
-	0x6f, 0x6e, 0x22, 0x69, 0x0a, 0x0a, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73,
-	0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x70, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x70, 0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12,
-	0x19, 0x0a, 0x08, 0x6f, 0x70, 0x74, 0x5f, 0x62, 0x6f, 0x6f, 0x6c, 0x18, 0x65, 0x20, 0x01, 0x28,
-	0x08, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x42, 0x6f, 0x6f, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x70,
-	0x74, 0x5f, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6f,
-	0x70, 0x74, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x2a, 0x04, 0x08, 0x14, 0x10, 0x65, 0x22, 0xe4, 0x04,
-	0x0a, 0x13, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x43, 0x6f, 0x6e, 0x74,
-	0x61, 0x69, 0x6e, 0x65, 0x72, 0x32, 0x38, 0x0a, 0x0c, 0x6f, 0x70, 0x74, 0x5f, 0x65, 0x78, 0x74,
-	0x5f, 0x62, 0x6f, 0x6f, 0x6c, 0x12, 0x16, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f,
-	0x6e, 0x73, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x33, 0x20,
-	0x01, 0x28, 0x08, 0x52, 0x0a, 0x6f, 0x70, 0x74, 0x45, 0x78, 0x74, 0x42, 0x6f, 0x6f, 0x6c, 0x32,
-	0x3c, 0x0a, 0x0e, 0x6f, 0x70, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e,
-	0x67, 0x12, 0x16, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45,
-	0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x34, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x0c, 0x6f, 0x70, 0x74, 0x45, 0x78, 0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x32, 0x4a, 0x0a,
-	0x0c, 0x6f, 0x70, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x16, 0x2e,
-	0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e,
-	0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x35, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x70, 0x62,
-	0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x0a, 0x6f,
-	0x70, 0x74, 0x45, 0x78, 0x74, 0x45, 0x6e, 0x75, 0x6d, 0x32, 0x50, 0x0a, 0x0e, 0x6f, 0x70, 0x74,
-	0x5f, 0x65, 0x78, 0x74, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, 0x16, 0x2e, 0x70, 0x62,
-	0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69,
-	0x6f, 0x6e, 0x73, 0x18, 0x36, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x62, 0x65, 0x64,
-	0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x52, 0x0c, 0x6f,
-	0x70, 0x74, 0x45, 0x78, 0x74, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x32, 0x5b, 0x0a, 0x0f, 0x6f,
-	0x70, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x16,
-	0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x78, 0x74, 0x65,
-	0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x37, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70,
-	0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61,
-	0x6c, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x52, 0x0d, 0x6f, 0x70, 0x74, 0x45, 0x78,
-	0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x32, 0x3c, 0x0a, 0x0e, 0x72, 0x70, 0x74, 0x5f,
-	0x65, 0x78, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x16, 0x2e, 0x70, 0x62, 0x65,
-	0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f,
-	0x6e, 0x73, 0x18, 0x3d, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x70, 0x74, 0x45, 0x78, 0x74,
-	0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x32, 0x4a, 0x0a, 0x0c, 0x72, 0x70, 0x74, 0x5f, 0x65, 0x78,
-	0x74, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x16, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69,
-	0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x3e,
-	0x20, 0x03, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e,
-	0x73, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x0a, 0x72, 0x70, 0x74, 0x45, 0x78, 0x74, 0x45, 0x6e,
-	0x75, 0x6d, 0x32, 0x50, 0x0a, 0x0e, 0x72, 0x70, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x5f, 0x6e, 0x65,
-	0x73, 0x74, 0x65, 0x64, 0x12, 0x16, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e,
-	0x73, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x3f, 0x20, 0x03,
-	0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e,
-	0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x52, 0x0c, 0x72, 0x70, 0x74, 0x45, 0x78, 0x74, 0x4e, 0x65,
-	0x73, 0x74, 0x65, 0x64, 0x22, 0x1a, 0x0a, 0x0a, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53,
-	0x65, 0x74, 0x2a, 0x08, 0x08, 0x04, 0x10, 0xff, 0xff, 0xff, 0xff, 0x07, 0x3a, 0x02, 0x08, 0x01,
-	0x22, 0xe0, 0x02, 0x0a, 0x13, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x45,
-	0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x70, 0x74, 0x5f,
+	0x70, 0x74, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, 0x3d, 0x0a, 0x08, 0x6f, 0x70, 0x74, 0x67,
+	0x72, 0x6f, 0x75, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x62, 0x65,
+	0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x4f, 0x70,
+	0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x42, 0x05, 0xaa, 0x01, 0x02, 0x28, 0x02, 0x52, 0x08, 0x6f,
+	0x70, 0x74, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x31, 0x0a, 0x0a, 0x72, 0x70, 0x74, 0x5f, 0x6e,
+	0x65, 0x73, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x62,
+	0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x52,
+	0x09, 0x72, 0x70, 0x74, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, 0x3f, 0x0a, 0x08, 0x72, 0x70,
+	0x74, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70,
+	0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x73, 0x2e,
+	0x52, 0x70, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x42, 0x07, 0xaa, 0x01, 0x04, 0x18, 0x02, 0x28,
+	0x02, 0x52, 0x08, 0x72, 0x70, 0x74, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x1a, 0xe9, 0x01, 0x0a, 0x08,
+	0x4f, 0x70, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x70, 0x74, 0x5f,
 	0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x70,
-	0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x32, 0x6b, 0x0a, 0x15, 0x6d, 0x65, 0x73, 0x73, 0x61,
-	0x67, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e,
-	0x12, 0x16, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4d, 0x65,
-	0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f,
-	0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4d, 0x65, 0x73, 0x73,
-	0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52,
-	0x13, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e,
-	0x73, 0x69, 0x6f, 0x6e, 0x32, 0x72, 0x0a, 0x19, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x65, 0x73, 0x73,
-	0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f,
-	0x6e, 0x12, 0x16, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4d,
-	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32,
-	0x1f, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4d, 0x65, 0x73,
-	0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e,
-	0x52, 0x16, 0x6e, 0x6f, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x45,
-	0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x32, 0x49, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x5f,
-	0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, 0x16, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69,
-	0x6f, 0x6e, 0x73, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x18, 0x1e,
-	0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e,
-	0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x52, 0x09, 0x65, 0x78, 0x74, 0x4e, 0x65, 0x73,
-	0x74, 0x65, 0x64, 0x22, 0x1a, 0x0a, 0x0e, 0x46, 0x61, 0x6b, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61,
-	0x67, 0x65, 0x53, 0x65, 0x74, 0x2a, 0x08, 0x08, 0x04, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x22,
-	0xad, 0x01, 0x0a, 0x17, 0x46, 0x61, 0x6b, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53,
+	0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x31, 0x0a, 0x0a, 0x6f, 0x70, 0x74, 0x5f, 0x6e,
+	0x65, 0x73, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x62,
+	0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x52,
+	0x09, 0x6f, 0x70, 0x74, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, 0x58, 0x0a, 0x0e, 0x6f, 0x70,
+	0x74, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x03, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e,
+	0x4e, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x4f, 0x70, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x4f,
+	0x70, 0x74, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x42, 0x05, 0xaa,
+	0x01, 0x02, 0x28, 0x02, 0x52, 0x0e, 0x6f, 0x70, 0x74, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x67,
+	0x72, 0x6f, 0x75, 0x70, 0x1a, 0x31, 0x0a, 0x0e, 0x4f, 0x70, 0x74, 0x4e, 0x65, 0x73, 0x74, 0x65,
+	0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x70, 0x74, 0x5f, 0x66, 0x69,
+	0x78, 0x65, 0x64, 0x33, 0x32, 0x18, 0x01, 0x20, 0x01, 0x28, 0x07, 0x52, 0x0a, 0x6f, 0x70, 0x74,
+	0x46, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x1a, 0x29, 0x0a, 0x08, 0x52, 0x70, 0x74, 0x47, 0x72,
+	0x6f, 0x75, 0x70, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x70, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e,
+	0x67, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x70, 0x74, 0x53, 0x74, 0x72, 0x69,
+	0x6e, 0x67, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x66, 0x69, 0x65,
+	0x6c, 0x64, 0x22, 0x91, 0x02, 0x0a, 0x09, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x73,
+	0x12, 0x20, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x5f, 0x62, 0x6f, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x08, 0x42, 0x05, 0xaa, 0x01, 0x02, 0x08, 0x03, 0x52, 0x07, 0x72, 0x65, 0x71, 0x42, 0x6f,
+	0x6f, 0x6c, 0x12, 0x28, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x5f, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64,
+	0x36, 0x34, 0x18, 0x02, 0x20, 0x01, 0x28, 0x10, 0x42, 0x05, 0xaa, 0x01, 0x02, 0x08, 0x03, 0x52,
+	0x0b, 0x72, 0x65, 0x71, 0x53, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x12, 0x24, 0x0a, 0x0a,
+	0x72, 0x65, 0x71, 0x5f, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01,
+	0x42, 0x05, 0xaa, 0x01, 0x02, 0x08, 0x03, 0x52, 0x09, 0x72, 0x65, 0x71, 0x44, 0x6f, 0x75, 0x62,
+	0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,
+	0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x05, 0xaa, 0x01, 0x02, 0x08, 0x03, 0x52, 0x09, 0x72,
+	0x65, 0x71, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x32, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x5f,
+	0x65, 0x6e, 0x75, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x70, 0x62, 0x65,
+	0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x42, 0x05, 0xaa, 0x01,
+	0x02, 0x08, 0x03, 0x52, 0x07, 0x72, 0x65, 0x71, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x38, 0x0a, 0x0a,
+	0x72, 0x65, 0x71, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x12, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4e, 0x65,
+	0x73, 0x74, 0x65, 0x64, 0x42, 0x05, 0xaa, 0x01, 0x02, 0x08, 0x03, 0x52, 0x09, 0x72, 0x65, 0x71,
+	0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x22, 0x56, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61,
+	0x6c, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x24, 0x0a, 0x0a, 0x72, 0x65, 0x71,
+	0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x05, 0xaa,
+	0x01, 0x02, 0x08, 0x03, 0x52, 0x09, 0x72, 0x65, 0x71, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12,
+	0x1d, 0x0a, 0x0a, 0x6f, 0x70, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x70, 0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x3a,
+	0x0a, 0x12, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x57, 0x69, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75,
+	0x69, 0x72, 0x65, 0x64, 0x12, 0x24, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x5f, 0x73, 0x74, 0x72, 0x69,
+	0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x05, 0xaa, 0x01, 0x02, 0x08, 0x03, 0x52,
+	0x09, 0x72, 0x65, 0x71, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x98, 0x03, 0x0a, 0x10, 0x49,
+	0x6e, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12,
+	0x44, 0x0a, 0x0a, 0x6f, 0x70, 0x74, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+	0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x57, 0x69, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x69,
+	0x72, 0x65, 0x64, 0x42, 0x05, 0xaa, 0x01, 0x02, 0x08, 0x03, 0x52, 0x09, 0x6f, 0x70, 0x74, 0x4e,
+	0x65, 0x73, 0x74, 0x65, 0x64, 0x12, 0x3d, 0x0a, 0x0a, 0x72, 0x70, 0x74, 0x5f, 0x6e, 0x65, 0x73,
+	0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x62, 0x65, 0x64,
+	0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x57, 0x69, 0x74,
+	0x68, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x52, 0x09, 0x72, 0x70, 0x74, 0x4e, 0x65,
+	0x73, 0x74, 0x65, 0x64, 0x12, 0x51, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x5f, 0x74, 0x6f, 0x5f, 0x6e,
+	0x65, 0x73, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x62,
+	0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x49, 0x6e, 0x64, 0x69, 0x72, 0x65, 0x63,
+	0x74, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x2e, 0x53, 0x74, 0x72, 0x54, 0x6f, 0x4e,
+	0x65, 0x73, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x54,
+	0x6f, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, 0x43, 0x0a, 0x0c, 0x6f, 0x6e, 0x65, 0x6f, 0x66,
+	0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e,
+	0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65,
+	0x64, 0x57, 0x69, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x48, 0x00, 0x52,
+	0x0b, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x1a, 0x5e, 0x0a, 0x10,
+	0x53, 0x74, 0x72, 0x54, 0x6f, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79,
+	0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b,
+	0x65, 0x79, 0x12, 0x34, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4e,
+	0x65, 0x73, 0x74, 0x65, 0x64, 0x57, 0x69, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65,
+	0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x07, 0x0a, 0x05,
+	0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x22, 0x69, 0x0a, 0x0a, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69,
+	0x6f, 0x6e, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x70, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e,
+	0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x70, 0x74, 0x53, 0x74, 0x72, 0x69,
+	0x6e, 0x67, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x70, 0x74, 0x5f, 0x62, 0x6f, 0x6f, 0x6c, 0x18, 0x65,
+	0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x42, 0x6f, 0x6f, 0x6c, 0x12, 0x1b, 0x0a,
+	0x09, 0x6f, 0x70, 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05,
+	0x52, 0x08, 0x6f, 0x70, 0x74, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x2a, 0x04, 0x08, 0x14, 0x10, 0x65,
+	0x22, 0xe4, 0x04, 0x0a, 0x13, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x43,
+	0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x32, 0x38, 0x0a, 0x0c, 0x6f, 0x70, 0x74, 0x5f,
+	0x65, 0x78, 0x74, 0x5f, 0x62, 0x6f, 0x6f, 0x6c, 0x12, 0x16, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69,
+	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73,
+	0x18, 0x33, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x6f, 0x70, 0x74, 0x45, 0x78, 0x74, 0x42, 0x6f,
+	0x6f, 0x6c, 0x32, 0x3c, 0x0a, 0x0e, 0x6f, 0x70, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x5f, 0x73, 0x74,
+	0x72, 0x69, 0x6e, 0x67, 0x12, 0x16, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e,
+	0x73, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x34, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x0c, 0x6f, 0x70, 0x74, 0x45, 0x78, 0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67,
+	0x32, 0x4a, 0x0a, 0x0c, 0x6f, 0x70, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x5f, 0x65, 0x6e, 0x75, 0x6d,
+	0x12, 0x16, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x78,
+	0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x35, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10,
+	0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x6e, 0x75, 0x6d,
+	0x52, 0x0a, 0x6f, 0x70, 0x74, 0x45, 0x78, 0x74, 0x45, 0x6e, 0x75, 0x6d, 0x32, 0x50, 0x0a, 0x0e,
+	0x6f, 0x70, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, 0x16,
+	0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x78, 0x74, 0x65,
+	0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x36, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70,
+	0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64,
+	0x52, 0x0c, 0x6f, 0x70, 0x74, 0x45, 0x78, 0x74, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x32, 0x5b,
+	0x0a, 0x0f, 0x6f, 0x70, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61,
+	0x6c, 0x12, 0x16, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45,
+	0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x37, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x1b, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x50, 0x61, 0x72,
+	0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x52, 0x0d, 0x6f, 0x70,
+	0x74, 0x45, 0x78, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x32, 0x3c, 0x0a, 0x0e, 0x72,
+	0x70, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x16, 0x2e,
+	0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e,
+	0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x3d, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x70, 0x74,
+	0x45, 0x78, 0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x32, 0x4a, 0x0a, 0x0c, 0x72, 0x70, 0x74,
+	0x5f, 0x65, 0x78, 0x74, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x16, 0x2e, 0x70, 0x62, 0x65, 0x64,
+	0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e,
+	0x73, 0x18, 0x3e, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74,
+	0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x0a, 0x72, 0x70, 0x74, 0x45, 0x78,
+	0x74, 0x45, 0x6e, 0x75, 0x6d, 0x32, 0x50, 0x0a, 0x0e, 0x72, 0x70, 0x74, 0x5f, 0x65, 0x78, 0x74,
+	0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, 0x16, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74,
+	0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18,
+	0x3f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f,
+	0x6e, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x52, 0x0c, 0x72, 0x70, 0x74, 0x45, 0x78,
+	0x74, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x22, 0x1a, 0x0a, 0x0a, 0x4d, 0x65, 0x73, 0x73, 0x61,
+	0x67, 0x65, 0x53, 0x65, 0x74, 0x2a, 0x08, 0x08, 0x04, 0x10, 0xff, 0xff, 0xff, 0xff, 0x07, 0x3a,
+	0x02, 0x08, 0x01, 0x22, 0xe0, 0x02, 0x0a, 0x13, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53,
 	0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x6f,
 	0x70, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x09, 0x6f, 0x70, 0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x32, 0x73, 0x0a, 0x15, 0x6d, 0x65,
+	0x09, 0x6f, 0x70, 0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x32, 0x6b, 0x0a, 0x15, 0x6d, 0x65,
 	0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73,
-	0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73,
-	0x2e, 0x46, 0x61, 0x6b, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x18,
-	0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f,
-	0x6e, 0x73, 0x2e, 0x46, 0x61, 0x6b, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65,
-	0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x6d, 0x65, 0x73, 0x73,
-	0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22,
-	0x9e, 0x08, 0x0a, 0x0a, 0x4b, 0x6e, 0x6f, 0x77, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x35,
-	0x0a, 0x08, 0x6f, 0x70, 0x74, 0x5f, 0x62, 0x6f, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
-	0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
-	0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x6f, 0x70,
-	0x74, 0x42, 0x6f, 0x6f, 0x6c, 0x12, 0x38, 0x0a, 0x09, 0x6f, 0x70, 0x74, 0x5f, 0x69, 0x6e, 0x74,
-	0x33, 0x32, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
-	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32,
-	0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6f, 0x70, 0x74, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x12,
-	0x38, 0x0a, 0x09, 0x6f, 0x70, 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x18, 0x03, 0x20, 0x01,
-	0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52,
-	0x08, 0x6f, 0x70, 0x74, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x3b, 0x0a, 0x0a, 0x6f, 0x70, 0x74,
-	0x5f, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e,
+	0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+	0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4d,
+	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69,
+	0x6f, 0x6e, 0x52, 0x13, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x45, 0x78,
+	0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x32, 0x72, 0x0a, 0x19, 0x6e, 0x6f, 0x74, 0x5f, 0x6d,
+	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e,
+	0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e,
+	0x73, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x18, 0x14, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e,
+	0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73,
+	0x69, 0x6f, 0x6e, 0x52, 0x16, 0x6e, 0x6f, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53,
+	0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x32, 0x49, 0x0a, 0x0a, 0x65,
+	0x78, 0x74, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, 0x16, 0x2e, 0x70, 0x62, 0x65, 0x64,
+	0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65,
+	0x74, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74,
+	0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x52, 0x09, 0x65, 0x78, 0x74,
+	0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x22, 0x1a, 0x0a, 0x0e, 0x46, 0x61, 0x6b, 0x65, 0x4d, 0x65,
+	0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x2a, 0x08, 0x08, 0x04, 0x10, 0x80, 0x80, 0x80,
+	0x80, 0x02, 0x22, 0xad, 0x01, 0x0a, 0x17, 0x46, 0x61, 0x6b, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61,
+	0x67, 0x65, 0x53, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1d,
+	0x0a, 0x0a, 0x6f, 0x70, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x09, 0x6f, 0x70, 0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x32, 0x73, 0x0a,
+	0x15, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x65, 0x78, 0x74,
+	0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69,
+	0x6f, 0x6e, 0x73, 0x2e, 0x46, 0x61, 0x6b, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53,
+	0x65, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69,
+	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x46, 0x61, 0x6b, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67,
+	0x65, 0x53, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x6d,
+	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69,
+	0x6f, 0x6e, 0x22, 0x9e, 0x08, 0x0a, 0x0a, 0x4b, 0x6e, 0x6f, 0x77, 0x6e, 0x54, 0x79, 0x70, 0x65,
+	0x73, 0x12, 0x35, 0x0a, 0x08, 0x6f, 0x70, 0x74, 0x5f, 0x62, 0x6f, 0x6f, 0x6c, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52,
+	0x07, 0x6f, 0x70, 0x74, 0x42, 0x6f, 0x6f, 0x6c, 0x12, 0x38, 0x0a, 0x09, 0x6f, 0x70, 0x74, 0x5f,
+	0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f,
+	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e,
+	0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6f, 0x70, 0x74, 0x49, 0x6e, 0x74,
+	0x33, 0x32, 0x12, 0x38, 0x0a, 0x09, 0x6f, 0x70, 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c,
+	0x75, 0x65, 0x52, 0x08, 0x6f, 0x70, 0x74, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x3b, 0x0a, 0x0a,
+	0x6f, 0x70, 0x74, 0x5f, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
+	0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x09,
+	0x6f, 0x70, 0x74, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x12, 0x3b, 0x0a, 0x0a, 0x6f, 0x70, 0x74,
+	0x5f, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e,
 	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
-	0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x09, 0x6f, 0x70, 0x74,
-	0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x12, 0x3b, 0x0a, 0x0a, 0x6f, 0x70, 0x74, 0x5f, 0x75, 0x69,
-	0x6e, 0x74, 0x36, 0x34, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f,
-	0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e,
-	0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x09, 0x6f, 0x70, 0x74, 0x55, 0x69, 0x6e,
-	0x74, 0x36, 0x34, 0x12, 0x38, 0x0a, 0x09, 0x6f, 0x70, 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74,
-	0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x56, 0x61,
-	0x6c, 0x75, 0x65, 0x52, 0x08, 0x6f, 0x70, 0x74, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x12, 0x3b, 0x0a,
-	0x0a, 0x6f, 0x70, 0x74, 0x5f, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28,
+	0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x09, 0x6f, 0x70, 0x74,
+	0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x38, 0x0a, 0x09, 0x6f, 0x70, 0x74, 0x5f, 0x66, 0x6c,
+	0x6f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x6c, 0x6f, 0x61,
+	0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6f, 0x70, 0x74, 0x46, 0x6c, 0x6f, 0x61, 0x74,
+	0x12, 0x3b, 0x0a, 0x0a, 0x6f, 0x70, 0x74, 0x5f, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x18, 0x07,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c,
+	0x75, 0x65, 0x52, 0x09, 0x6f, 0x70, 0x74, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x12, 0x3b, 0x0a,
+	0x0a, 0x6f, 0x70, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28,
 	0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
-	0x62, 0x75, 0x66, 0x2e, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52,
-	0x09, 0x6f, 0x70, 0x74, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x12, 0x3b, 0x0a, 0x0a, 0x6f, 0x70,
-	0x74, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c,
-	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
-	0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x09, 0x6f, 0x70,
-	0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x38, 0x0a, 0x09, 0x6f, 0x70, 0x74, 0x5f, 0x62,
-	0x79, 0x74, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f,
-	0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x79, 0x74,
-	0x65, 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6f, 0x70, 0x74, 0x42, 0x79, 0x74, 0x65,
-	0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x6f, 0x70, 0x74, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f,
-	0x6e, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
-	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69,
-	0x6f, 0x6e, 0x52, 0x0b, 0x6f, 0x70, 0x74, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12,
-	0x3f, 0x0a, 0x0d, 0x6f, 0x70, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,
-	0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61,
-	0x6d, 0x70, 0x52, 0x0c, 0x6f, 0x70, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,
-	0x12, 0x36, 0x0a, 0x0a, 0x6f, 0x70, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x18, 0x19,
-	0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
-	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x09, 0x6f,
-	0x70, 0x74, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x12, 0x35, 0x0a, 0x08, 0x6f, 0x70, 0x74, 0x5f,
-	0x6c, 0x69, 0x73, 0x74, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f,
-	0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4c, 0x69, 0x73,
-	0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12,
-	0x33, 0x0a, 0x09, 0x6f, 0x70, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x1b, 0x20, 0x01,
-	0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6f, 0x70, 0x74, 0x56,
-	0x61, 0x6c, 0x75, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x6f, 0x70, 0x74, 0x5f, 0x6e, 0x75, 0x6c, 0x6c,
-	0x18, 0x1c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c,
-	0x75, 0x65, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x4e, 0x75, 0x6c, 0x6c, 0x12, 0x33, 0x0a, 0x09, 0x6f,
-	0x70, 0x74, 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16,
-	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
-	0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x52, 0x08, 0x6f, 0x70, 0x74, 0x45, 0x6d, 0x70, 0x74, 0x79,
-	0x12, 0x2d, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x5f, 0x61, 0x6e, 0x79, 0x18, 0x20, 0x20, 0x01, 0x28,
-	0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
-	0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x06, 0x6f, 0x70, 0x74, 0x41, 0x6e, 0x79, 0x12,
-	0x3f, 0x0a, 0x0d, 0x6f, 0x70, 0x74, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x6d, 0x61, 0x73, 0x6b,
-	0x18, 0x28, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61,
-	0x73, 0x6b, 0x52, 0x0c, 0x6f, 0x70, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x6d, 0x61, 0x73, 0x6b,
-	0x2a, 0x21, 0x0a, 0x04, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x07, 0x0a, 0x03, 0x4f, 0x4e, 0x45, 0x10,
-	0x01, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x57, 0x4f, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x45,
-	0x4e, 0x10, 0x0a, 0x3a, 0x38, 0x0a, 0x0c, 0x6f, 0x70, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x5f, 0x62,
+	0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52,
+	0x09, 0x6f, 0x70, 0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x38, 0x0a, 0x09, 0x6f, 0x70,
+	0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e,
+	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
+	0x42, 0x79, 0x74, 0x65, 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6f, 0x70, 0x74, 0x42,
+	0x79, 0x74, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x6f, 0x70, 0x74, 0x5f, 0x64, 0x75, 0x72, 0x61,
+	0x74, 0x69, 0x6f, 0x6e, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f,
+	0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72,
+	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x6f, 0x70, 0x74, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69,
+	0x6f, 0x6e, 0x12, 0x3f, 0x0a, 0x0d, 0x6f, 0x70, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74,
+	0x61, 0x6d, 0x70, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65,
+	0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x6f, 0x70, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74,
+	0x61, 0x6d, 0x70, 0x12, 0x36, 0x0a, 0x0a, 0x6f, 0x70, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63,
+	0x74, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74,
+	0x52, 0x09, 0x6f, 0x70, 0x74, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x12, 0x35, 0x0a, 0x08, 0x6f,
+	0x70, 0x74, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e,
+	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
+	0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x4c, 0x69,
+	0x73, 0x74, 0x12, 0x33, 0x0a, 0x09, 0x6f, 0x70, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18,
+	0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6f,
+	0x70, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x6f, 0x70, 0x74, 0x5f, 0x6e,
+	0x75, 0x6c, 0x6c, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c,
+	0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x4e, 0x75, 0x6c, 0x6c, 0x12, 0x33,
+	0x0a, 0x09, 0x6f, 0x70, 0x74, 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x18, 0x1e, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x52, 0x08, 0x6f, 0x70, 0x74, 0x45, 0x6d,
+	0x70, 0x74, 0x79, 0x12, 0x2d, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x5f, 0x61, 0x6e, 0x79, 0x18, 0x20,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x06, 0x6f, 0x70, 0x74, 0x41,
+	0x6e, 0x79, 0x12, 0x3f, 0x0a, 0x0d, 0x6f, 0x70, 0x74, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x6d,
+	0x61, 0x73, 0x6b, 0x18, 0x28, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c,
+	0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x0c, 0x6f, 0x70, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x6d,
+	0x61, 0x73, 0x6b, 0x2a, 0x21, 0x0a, 0x04, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x07, 0x0a, 0x03, 0x4f,
+	0x4e, 0x45, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x57, 0x4f, 0x10, 0x02, 0x12, 0x07, 0x0a,
+	0x03, 0x54, 0x45, 0x4e, 0x10, 0x0a, 0x2a, 0x3b, 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x6e, 0x45, 0x6e,
+	0x75, 0x6d, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12,
+	0x08, 0x0a, 0x04, 0x45, 0x49, 0x4e, 0x53, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x5a, 0x57, 0x45,
+	0x49, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x5a, 0x45, 0x48, 0x4e, 0x10, 0x0a, 0x1a, 0x04, 0x3a,
+	0x02, 0x10, 0x01, 0x3a, 0x38, 0x0a, 0x0c, 0x6f, 0x70, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x5f, 0x62,
 	0x6f, 0x6f, 0x6c, 0x12, 0x16, 0x2e, 0x70, 0x62, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73,
 	0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28,
 	0x08, 0x52, 0x0a, 0x6f, 0x70, 0x74, 0x45, 0x78, 0x74, 0x42, 0x6f, 0x6f, 0x6c, 0x3a, 0x3c, 0x0a,
@@ -2353,12 +2595,12 @@ var file_internal_testprotos_textpbeditions_test2_proto_rawDesc = []byte{
 	0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x46, 0x61, 0x6b, 0x65, 0x4d, 0x65, 0x73,
 	0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e,
 	0x52, 0x13, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65,
-	0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x44, 0x5a, 0x3d, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+	0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x46, 0x5a, 0x3d, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
 	0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
 	0x62, 0x75, 0x66, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x73,
 	0x74, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x74, 0x65, 0x78, 0x74, 0x70, 0x62, 0x65, 0x64,
-	0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x92, 0x03, 0x02, 0x10, 0x02, 0x62, 0x08, 0x65, 0x64, 0x69,
-	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x70, 0xe8, 0x07,
+	0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x92, 0x03, 0x04, 0x10, 0x02, 0x20, 0x03, 0x62, 0x08, 0x65,
+	0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x70, 0xe8, 0x07,
 }
 
 var (
@@ -2373,135 +2615,142 @@ func file_internal_testprotos_textpbeditions_test2_proto_rawDescGZIP() []byte {
 	return file_internal_testprotos_textpbeditions_test2_proto_rawDescData
 }
 
-var file_internal_testprotos_textpbeditions_test2_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
-var file_internal_testprotos_textpbeditions_test2_proto_msgTypes = make([]protoimpl.MessageInfo, 24)
+var file_internal_testprotos_textpbeditions_test2_proto_enumTypes = make([]protoimpl.EnumInfo, 4)
+var file_internal_testprotos_textpbeditions_test2_proto_msgTypes = make([]protoimpl.MessageInfo, 26)
 var file_internal_testprotos_textpbeditions_test2_proto_goTypes = []interface{}{
 	(Enum)(0),                             // 0: pbeditions.Enum
-	(Enums_NestedEnum)(0),                 // 1: pbeditions.Enums.NestedEnum
-	(*Scalars)(nil),                       // 2: pbeditions.Scalars
-	(*ImplicitScalars)(nil),               // 3: pbeditions.ImplicitScalars
-	(*Enums)(nil),                         // 4: pbeditions.Enums
-	(*Repeats)(nil),                       // 5: pbeditions.Repeats
-	(*Maps)(nil),                          // 6: pbeditions.Maps
-	(*Nested)(nil),                        // 7: pbeditions.Nested
-	(*Nests)(nil),                         // 8: pbeditions.Nests
-	(*Requireds)(nil),                     // 9: pbeditions.Requireds
-	(*PartialRequired)(nil),               // 10: pbeditions.PartialRequired
-	(*NestedWithRequired)(nil),            // 11: pbeditions.NestedWithRequired
-	(*IndirectRequired)(nil),              // 12: pbeditions.IndirectRequired
-	(*Extensions)(nil),                    // 13: pbeditions.Extensions
-	(*ExtensionsContainer)(nil),           // 14: pbeditions.ExtensionsContainer
-	(*MessageSet)(nil),                    // 15: pbeditions.MessageSet
-	(*MessageSetExtension)(nil),           // 16: pbeditions.MessageSetExtension
-	(*FakeMessageSet)(nil),                // 17: pbeditions.FakeMessageSet
-	(*FakeMessageSetExtension)(nil),       // 18: pbeditions.FakeMessageSetExtension
-	(*KnownTypes)(nil),                    // 19: pbeditions.KnownTypes
-	nil,                                   // 20: pbeditions.Maps.Int32ToStrEntry
-	nil,                                   // 21: pbeditions.Maps.StrToNestedEntry
-	(*Nests_OptGroup)(nil),                // 22: pbeditions.Nests.OptGroup
-	(*Nests_RptGroup)(nil),                // 23: pbeditions.Nests.RptGroup
-	(*Nests_OptGroup_OptNestedGroup)(nil), // 24: pbeditions.Nests.OptGroup.OptNestedGroup
-	nil,                                   // 25: pbeditions.IndirectRequired.StrToNestedEntry
-	(*wrapperspb.BoolValue)(nil),          // 26: google.protobuf.BoolValue
-	(*wrapperspb.Int32Value)(nil),         // 27: google.protobuf.Int32Value
-	(*wrapperspb.Int64Value)(nil),         // 28: google.protobuf.Int64Value
-	(*wrapperspb.UInt32Value)(nil),        // 29: google.protobuf.UInt32Value
-	(*wrapperspb.UInt64Value)(nil),        // 30: google.protobuf.UInt64Value
-	(*wrapperspb.FloatValue)(nil),         // 31: google.protobuf.FloatValue
-	(*wrapperspb.DoubleValue)(nil),        // 32: google.protobuf.DoubleValue
-	(*wrapperspb.StringValue)(nil),        // 33: google.protobuf.StringValue
-	(*wrapperspb.BytesValue)(nil),         // 34: google.protobuf.BytesValue
-	(*durationpb.Duration)(nil),           // 35: google.protobuf.Duration
-	(*timestamppb.Timestamp)(nil),         // 36: google.protobuf.Timestamp
-	(*structpb.Struct)(nil),               // 37: google.protobuf.Struct
-	(*structpb.ListValue)(nil),            // 38: google.protobuf.ListValue
-	(*structpb.Value)(nil),                // 39: google.protobuf.Value
-	(structpb.NullValue)(0),               // 40: google.protobuf.NullValue
-	(*emptypb.Empty)(nil),                 // 41: google.protobuf.Empty
-	(*anypb.Any)(nil),                     // 42: google.protobuf.Any
-	(*fieldmaskpb.FieldMask)(nil),         // 43: google.protobuf.FieldMask
+	(OpenEnum)(0),                         // 1: pbeditions.OpenEnum
+	(Enums_NestedEnum)(0),                 // 2: pbeditions.Enums.NestedEnum
+	(Enums_NestedOpenEnum)(0),             // 3: pbeditions.Enums.NestedOpenEnum
+	(*Scalars)(nil),                       // 4: pbeditions.Scalars
+	(*ImplicitScalars)(nil),               // 5: pbeditions.ImplicitScalars
+	(*UTF8Validated)(nil),                 // 6: pbeditions.UTF8Validated
+	(*NestsUTF8Validated)(nil),            // 7: pbeditions.NestsUTF8Validated
+	(*Enums)(nil),                         // 8: pbeditions.Enums
+	(*Repeats)(nil),                       // 9: pbeditions.Repeats
+	(*Maps)(nil),                          // 10: pbeditions.Maps
+	(*Nested)(nil),                        // 11: pbeditions.Nested
+	(*Nests)(nil),                         // 12: pbeditions.Nests
+	(*Requireds)(nil),                     // 13: pbeditions.Requireds
+	(*PartialRequired)(nil),               // 14: pbeditions.PartialRequired
+	(*NestedWithRequired)(nil),            // 15: pbeditions.NestedWithRequired
+	(*IndirectRequired)(nil),              // 16: pbeditions.IndirectRequired
+	(*Extensions)(nil),                    // 17: pbeditions.Extensions
+	(*ExtensionsContainer)(nil),           // 18: pbeditions.ExtensionsContainer
+	(*MessageSet)(nil),                    // 19: pbeditions.MessageSet
+	(*MessageSetExtension)(nil),           // 20: pbeditions.MessageSetExtension
+	(*FakeMessageSet)(nil),                // 21: pbeditions.FakeMessageSet
+	(*FakeMessageSetExtension)(nil),       // 22: pbeditions.FakeMessageSetExtension
+	(*KnownTypes)(nil),                    // 23: pbeditions.KnownTypes
+	nil,                                   // 24: pbeditions.Maps.Int32ToStrEntry
+	nil,                                   // 25: pbeditions.Maps.StrToNestedEntry
+	(*Nests_OptGroup)(nil),                // 26: pbeditions.Nests.OptGroup
+	(*Nests_RptGroup)(nil),                // 27: pbeditions.Nests.RptGroup
+	(*Nests_OptGroup_OptNestedGroup)(nil), // 28: pbeditions.Nests.OptGroup.OptNestedGroup
+	nil,                                   // 29: pbeditions.IndirectRequired.StrToNestedEntry
+	(*wrapperspb.BoolValue)(nil),          // 30: google.protobuf.BoolValue
+	(*wrapperspb.Int32Value)(nil),         // 31: google.protobuf.Int32Value
+	(*wrapperspb.Int64Value)(nil),         // 32: google.protobuf.Int64Value
+	(*wrapperspb.UInt32Value)(nil),        // 33: google.protobuf.UInt32Value
+	(*wrapperspb.UInt64Value)(nil),        // 34: google.protobuf.UInt64Value
+	(*wrapperspb.FloatValue)(nil),         // 35: google.protobuf.FloatValue
+	(*wrapperspb.DoubleValue)(nil),        // 36: google.protobuf.DoubleValue
+	(*wrapperspb.StringValue)(nil),        // 37: google.protobuf.StringValue
+	(*wrapperspb.BytesValue)(nil),         // 38: google.protobuf.BytesValue
+	(*durationpb.Duration)(nil),           // 39: google.protobuf.Duration
+	(*timestamppb.Timestamp)(nil),         // 40: google.protobuf.Timestamp
+	(*structpb.Struct)(nil),               // 41: google.protobuf.Struct
+	(*structpb.ListValue)(nil),            // 42: google.protobuf.ListValue
+	(*structpb.Value)(nil),                // 43: google.protobuf.Value
+	(structpb.NullValue)(0),               // 44: google.protobuf.NullValue
+	(*emptypb.Empty)(nil),                 // 45: google.protobuf.Empty
+	(*anypb.Any)(nil),                     // 46: google.protobuf.Any
+	(*fieldmaskpb.FieldMask)(nil),         // 47: google.protobuf.FieldMask
 }
 var file_internal_testprotos_textpbeditions_test2_proto_depIdxs = []int32{
-	0,  // 0: pbeditions.Enums.opt_enum:type_name -> pbeditions.Enum
-	0,  // 1: pbeditions.Enums.rpt_enum:type_name -> pbeditions.Enum
-	1,  // 2: pbeditions.Enums.opt_nested_enum:type_name -> pbeditions.Enums.NestedEnum
-	1,  // 3: pbeditions.Enums.rpt_nested_enum:type_name -> pbeditions.Enums.NestedEnum
-	20, // 4: pbeditions.Maps.int32_to_str:type_name -> pbeditions.Maps.Int32ToStrEntry
-	21, // 5: pbeditions.Maps.str_to_nested:type_name -> pbeditions.Maps.StrToNestedEntry
-	7,  // 6: pbeditions.Nested.opt_nested:type_name -> pbeditions.Nested
-	7,  // 7: pbeditions.Nests.opt_nested:type_name -> pbeditions.Nested
-	22, // 8: pbeditions.Nests.optgroup:type_name -> pbeditions.Nests.OptGroup
-	7,  // 9: pbeditions.Nests.rpt_nested:type_name -> pbeditions.Nested
-	23, // 10: pbeditions.Nests.rptgroup:type_name -> pbeditions.Nests.RptGroup
-	0,  // 11: pbeditions.Requireds.req_enum:type_name -> pbeditions.Enum
-	7,  // 12: pbeditions.Requireds.req_nested:type_name -> pbeditions.Nested
-	11, // 13: pbeditions.IndirectRequired.opt_nested:type_name -> pbeditions.NestedWithRequired
-	11, // 14: pbeditions.IndirectRequired.rpt_nested:type_name -> pbeditions.NestedWithRequired
-	25, // 15: pbeditions.IndirectRequired.str_to_nested:type_name -> pbeditions.IndirectRequired.StrToNestedEntry
-	11, // 16: pbeditions.IndirectRequired.oneof_nested:type_name -> pbeditions.NestedWithRequired
-	26, // 17: pbeditions.KnownTypes.opt_bool:type_name -> google.protobuf.BoolValue
-	27, // 18: pbeditions.KnownTypes.opt_int32:type_name -> google.protobuf.Int32Value
-	28, // 19: pbeditions.KnownTypes.opt_int64:type_name -> google.protobuf.Int64Value
-	29, // 20: pbeditions.KnownTypes.opt_uint32:type_name -> google.protobuf.UInt32Value
-	30, // 21: pbeditions.KnownTypes.opt_uint64:type_name -> google.protobuf.UInt64Value
-	31, // 22: pbeditions.KnownTypes.opt_float:type_name -> google.protobuf.FloatValue
-	32, // 23: pbeditions.KnownTypes.opt_double:type_name -> google.protobuf.DoubleValue
-	33, // 24: pbeditions.KnownTypes.opt_string:type_name -> google.protobuf.StringValue
-	34, // 25: pbeditions.KnownTypes.opt_bytes:type_name -> google.protobuf.BytesValue
-	35, // 26: pbeditions.KnownTypes.opt_duration:type_name -> google.protobuf.Duration
-	36, // 27: pbeditions.KnownTypes.opt_timestamp:type_name -> google.protobuf.Timestamp
-	37, // 28: pbeditions.KnownTypes.opt_struct:type_name -> google.protobuf.Struct
-	38, // 29: pbeditions.KnownTypes.opt_list:type_name -> google.protobuf.ListValue
-	39, // 30: pbeditions.KnownTypes.opt_value:type_name -> google.protobuf.Value
-	40, // 31: pbeditions.KnownTypes.opt_null:type_name -> google.protobuf.NullValue
-	41, // 32: pbeditions.KnownTypes.opt_empty:type_name -> google.protobuf.Empty
-	42, // 33: pbeditions.KnownTypes.opt_any:type_name -> google.protobuf.Any
-	43, // 34: pbeditions.KnownTypes.opt_fieldmask:type_name -> google.protobuf.FieldMask
-	7,  // 35: pbeditions.Maps.StrToNestedEntry.value:type_name -> pbeditions.Nested
-	7,  // 36: pbeditions.Nests.OptGroup.opt_nested:type_name -> pbeditions.Nested
-	24, // 37: pbeditions.Nests.OptGroup.optnestedgroup:type_name -> pbeditions.Nests.OptGroup.OptNestedGroup
-	11, // 38: pbeditions.IndirectRequired.StrToNestedEntry.value:type_name -> pbeditions.NestedWithRequired
-	13, // 39: pbeditions.opt_ext_bool:extendee -> pbeditions.Extensions
-	13, // 40: pbeditions.opt_ext_string:extendee -> pbeditions.Extensions
-	13, // 41: pbeditions.opt_ext_enum:extendee -> pbeditions.Extensions
-	13, // 42: pbeditions.opt_ext_nested:extendee -> pbeditions.Extensions
-	13, // 43: pbeditions.opt_ext_partial:extendee -> pbeditions.Extensions
-	13, // 44: pbeditions.rpt_ext_fixed32:extendee -> pbeditions.Extensions
-	13, // 45: pbeditions.rpt_ext_enum:extendee -> pbeditions.Extensions
-	13, // 46: pbeditions.rpt_ext_nested:extendee -> pbeditions.Extensions
-	15, // 47: pbeditions.message_set_extension:extendee -> pbeditions.MessageSet
-	13, // 48: pbeditions.ExtensionsContainer.opt_ext_bool:extendee -> pbeditions.Extensions
-	13, // 49: pbeditions.ExtensionsContainer.opt_ext_string:extendee -> pbeditions.Extensions
-	13, // 50: pbeditions.ExtensionsContainer.opt_ext_enum:extendee -> pbeditions.Extensions
-	13, // 51: pbeditions.ExtensionsContainer.opt_ext_nested:extendee -> pbeditions.Extensions
-	13, // 52: pbeditions.ExtensionsContainer.opt_ext_partial:extendee -> pbeditions.Extensions
-	13, // 53: pbeditions.ExtensionsContainer.rpt_ext_string:extendee -> pbeditions.Extensions
-	13, // 54: pbeditions.ExtensionsContainer.rpt_ext_enum:extendee -> pbeditions.Extensions
-	13, // 55: pbeditions.ExtensionsContainer.rpt_ext_nested:extendee -> pbeditions.Extensions
-	15, // 56: pbeditions.MessageSetExtension.message_set_extension:extendee -> pbeditions.MessageSet
-	15, // 57: pbeditions.MessageSetExtension.not_message_set_extension:extendee -> pbeditions.MessageSet
-	15, // 58: pbeditions.MessageSetExtension.ext_nested:extendee -> pbeditions.MessageSet
-	17, // 59: pbeditions.FakeMessageSetExtension.message_set_extension:extendee -> pbeditions.FakeMessageSet
-	0,  // 60: pbeditions.opt_ext_enum:type_name -> pbeditions.Enum
-	7,  // 61: pbeditions.opt_ext_nested:type_name -> pbeditions.Nested
-	10, // 62: pbeditions.opt_ext_partial:type_name -> pbeditions.PartialRequired
-	0,  // 63: pbeditions.rpt_ext_enum:type_name -> pbeditions.Enum
-	7,  // 64: pbeditions.rpt_ext_nested:type_name -> pbeditions.Nested
-	18, // 65: pbeditions.message_set_extension:type_name -> pbeditions.FakeMessageSetExtension
-	0,  // 66: pbeditions.ExtensionsContainer.opt_ext_enum:type_name -> pbeditions.Enum
-	7,  // 67: pbeditions.ExtensionsContainer.opt_ext_nested:type_name -> pbeditions.Nested
-	10, // 68: pbeditions.ExtensionsContainer.opt_ext_partial:type_name -> pbeditions.PartialRequired
-	0,  // 69: pbeditions.ExtensionsContainer.rpt_ext_enum:type_name -> pbeditions.Enum
-	7,  // 70: pbeditions.ExtensionsContainer.rpt_ext_nested:type_name -> pbeditions.Nested
-	16, // 71: pbeditions.MessageSetExtension.message_set_extension:type_name -> pbeditions.MessageSetExtension
-	16, // 72: pbeditions.MessageSetExtension.not_message_set_extension:type_name -> pbeditions.MessageSetExtension
-	7,  // 73: pbeditions.MessageSetExtension.ext_nested:type_name -> pbeditions.Nested
-	18, // 74: pbeditions.FakeMessageSetExtension.message_set_extension:type_name -> pbeditions.FakeMessageSetExtension
-	75, // [75:75] is the sub-list for method output_type
-	75, // [75:75] is the sub-list for method input_type
-	60, // [60:75] is the sub-list for extension type_name
-	39, // [39:60] is the sub-list for extension extendee
-	0,  // [0:39] is the sub-list for field type_name
+	6,  // 0: pbeditions.NestsUTF8Validated.validated_message:type_name -> pbeditions.UTF8Validated
+	0,  // 1: pbeditions.Enums.opt_enum:type_name -> pbeditions.Enum
+	0,  // 2: pbeditions.Enums.rpt_enum:type_name -> pbeditions.Enum
+	1,  // 3: pbeditions.Enums.implicit_enum:type_name -> pbeditions.OpenEnum
+	2,  // 4: pbeditions.Enums.opt_nested_enum:type_name -> pbeditions.Enums.NestedEnum
+	2,  // 5: pbeditions.Enums.rpt_nested_enum:type_name -> pbeditions.Enums.NestedEnum
+	3,  // 6: pbeditions.Enums.implicit_nested_enum:type_name -> pbeditions.Enums.NestedOpenEnum
+	24, // 7: pbeditions.Maps.int32_to_str:type_name -> pbeditions.Maps.Int32ToStrEntry
+	25, // 8: pbeditions.Maps.str_to_nested:type_name -> pbeditions.Maps.StrToNestedEntry
+	11, // 9: pbeditions.Nested.opt_nested:type_name -> pbeditions.Nested
+	11, // 10: pbeditions.Nests.opt_nested:type_name -> pbeditions.Nested
+	26, // 11: pbeditions.Nests.optgroup:type_name -> pbeditions.Nests.OptGroup
+	11, // 12: pbeditions.Nests.rpt_nested:type_name -> pbeditions.Nested
+	27, // 13: pbeditions.Nests.rptgroup:type_name -> pbeditions.Nests.RptGroup
+	0,  // 14: pbeditions.Requireds.req_enum:type_name -> pbeditions.Enum
+	11, // 15: pbeditions.Requireds.req_nested:type_name -> pbeditions.Nested
+	15, // 16: pbeditions.IndirectRequired.opt_nested:type_name -> pbeditions.NestedWithRequired
+	15, // 17: pbeditions.IndirectRequired.rpt_nested:type_name -> pbeditions.NestedWithRequired
+	29, // 18: pbeditions.IndirectRequired.str_to_nested:type_name -> pbeditions.IndirectRequired.StrToNestedEntry
+	15, // 19: pbeditions.IndirectRequired.oneof_nested:type_name -> pbeditions.NestedWithRequired
+	30, // 20: pbeditions.KnownTypes.opt_bool:type_name -> google.protobuf.BoolValue
+	31, // 21: pbeditions.KnownTypes.opt_int32:type_name -> google.protobuf.Int32Value
+	32, // 22: pbeditions.KnownTypes.opt_int64:type_name -> google.protobuf.Int64Value
+	33, // 23: pbeditions.KnownTypes.opt_uint32:type_name -> google.protobuf.UInt32Value
+	34, // 24: pbeditions.KnownTypes.opt_uint64:type_name -> google.protobuf.UInt64Value
+	35, // 25: pbeditions.KnownTypes.opt_float:type_name -> google.protobuf.FloatValue
+	36, // 26: pbeditions.KnownTypes.opt_double:type_name -> google.protobuf.DoubleValue
+	37, // 27: pbeditions.KnownTypes.opt_string:type_name -> google.protobuf.StringValue
+	38, // 28: pbeditions.KnownTypes.opt_bytes:type_name -> google.protobuf.BytesValue
+	39, // 29: pbeditions.KnownTypes.opt_duration:type_name -> google.protobuf.Duration
+	40, // 30: pbeditions.KnownTypes.opt_timestamp:type_name -> google.protobuf.Timestamp
+	41, // 31: pbeditions.KnownTypes.opt_struct:type_name -> google.protobuf.Struct
+	42, // 32: pbeditions.KnownTypes.opt_list:type_name -> google.protobuf.ListValue
+	43, // 33: pbeditions.KnownTypes.opt_value:type_name -> google.protobuf.Value
+	44, // 34: pbeditions.KnownTypes.opt_null:type_name -> google.protobuf.NullValue
+	45, // 35: pbeditions.KnownTypes.opt_empty:type_name -> google.protobuf.Empty
+	46, // 36: pbeditions.KnownTypes.opt_any:type_name -> google.protobuf.Any
+	47, // 37: pbeditions.KnownTypes.opt_fieldmask:type_name -> google.protobuf.FieldMask
+	11, // 38: pbeditions.Maps.StrToNestedEntry.value:type_name -> pbeditions.Nested
+	11, // 39: pbeditions.Nests.OptGroup.opt_nested:type_name -> pbeditions.Nested
+	28, // 40: pbeditions.Nests.OptGroup.optnestedgroup:type_name -> pbeditions.Nests.OptGroup.OptNestedGroup
+	15, // 41: pbeditions.IndirectRequired.StrToNestedEntry.value:type_name -> pbeditions.NestedWithRequired
+	17, // 42: pbeditions.opt_ext_bool:extendee -> pbeditions.Extensions
+	17, // 43: pbeditions.opt_ext_string:extendee -> pbeditions.Extensions
+	17, // 44: pbeditions.opt_ext_enum:extendee -> pbeditions.Extensions
+	17, // 45: pbeditions.opt_ext_nested:extendee -> pbeditions.Extensions
+	17, // 46: pbeditions.opt_ext_partial:extendee -> pbeditions.Extensions
+	17, // 47: pbeditions.rpt_ext_fixed32:extendee -> pbeditions.Extensions
+	17, // 48: pbeditions.rpt_ext_enum:extendee -> pbeditions.Extensions
+	17, // 49: pbeditions.rpt_ext_nested:extendee -> pbeditions.Extensions
+	19, // 50: pbeditions.message_set_extension:extendee -> pbeditions.MessageSet
+	17, // 51: pbeditions.ExtensionsContainer.opt_ext_bool:extendee -> pbeditions.Extensions
+	17, // 52: pbeditions.ExtensionsContainer.opt_ext_string:extendee -> pbeditions.Extensions
+	17, // 53: pbeditions.ExtensionsContainer.opt_ext_enum:extendee -> pbeditions.Extensions
+	17, // 54: pbeditions.ExtensionsContainer.opt_ext_nested:extendee -> pbeditions.Extensions
+	17, // 55: pbeditions.ExtensionsContainer.opt_ext_partial:extendee -> pbeditions.Extensions
+	17, // 56: pbeditions.ExtensionsContainer.rpt_ext_string:extendee -> pbeditions.Extensions
+	17, // 57: pbeditions.ExtensionsContainer.rpt_ext_enum:extendee -> pbeditions.Extensions
+	17, // 58: pbeditions.ExtensionsContainer.rpt_ext_nested:extendee -> pbeditions.Extensions
+	19, // 59: pbeditions.MessageSetExtension.message_set_extension:extendee -> pbeditions.MessageSet
+	19, // 60: pbeditions.MessageSetExtension.not_message_set_extension:extendee -> pbeditions.MessageSet
+	19, // 61: pbeditions.MessageSetExtension.ext_nested:extendee -> pbeditions.MessageSet
+	21, // 62: pbeditions.FakeMessageSetExtension.message_set_extension:extendee -> pbeditions.FakeMessageSet
+	0,  // 63: pbeditions.opt_ext_enum:type_name -> pbeditions.Enum
+	11, // 64: pbeditions.opt_ext_nested:type_name -> pbeditions.Nested
+	14, // 65: pbeditions.opt_ext_partial:type_name -> pbeditions.PartialRequired
+	0,  // 66: pbeditions.rpt_ext_enum:type_name -> pbeditions.Enum
+	11, // 67: pbeditions.rpt_ext_nested:type_name -> pbeditions.Nested
+	22, // 68: pbeditions.message_set_extension:type_name -> pbeditions.FakeMessageSetExtension
+	0,  // 69: pbeditions.ExtensionsContainer.opt_ext_enum:type_name -> pbeditions.Enum
+	11, // 70: pbeditions.ExtensionsContainer.opt_ext_nested:type_name -> pbeditions.Nested
+	14, // 71: pbeditions.ExtensionsContainer.opt_ext_partial:type_name -> pbeditions.PartialRequired
+	0,  // 72: pbeditions.ExtensionsContainer.rpt_ext_enum:type_name -> pbeditions.Enum
+	11, // 73: pbeditions.ExtensionsContainer.rpt_ext_nested:type_name -> pbeditions.Nested
+	20, // 74: pbeditions.MessageSetExtension.message_set_extension:type_name -> pbeditions.MessageSetExtension
+	20, // 75: pbeditions.MessageSetExtension.not_message_set_extension:type_name -> pbeditions.MessageSetExtension
+	11, // 76: pbeditions.MessageSetExtension.ext_nested:type_name -> pbeditions.Nested
+	22, // 77: pbeditions.FakeMessageSetExtension.message_set_extension:type_name -> pbeditions.FakeMessageSetExtension
+	78, // [78:78] is the sub-list for method output_type
+	78, // [78:78] is the sub-list for method input_type
+	63, // [63:78] is the sub-list for extension type_name
+	42, // [42:63] is the sub-list for extension extendee
+	0,  // [0:42] is the sub-list for field type_name
 }
 
 func init() { file_internal_testprotos_textpbeditions_test2_proto_init() }
@@ -2535,7 +2784,7 @@ func file_internal_testprotos_textpbeditions_test2_proto_init() {
 			}
 		}
 		file_internal_testprotos_textpbeditions_test2_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Enums); i {
+			switch v := v.(*UTF8Validated); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2547,7 +2796,7 @@ func file_internal_testprotos_textpbeditions_test2_proto_init() {
 			}
 		}
 		file_internal_testprotos_textpbeditions_test2_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Repeats); i {
+			switch v := v.(*NestsUTF8Validated); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2559,7 +2808,7 @@ func file_internal_testprotos_textpbeditions_test2_proto_init() {
 			}
 		}
 		file_internal_testprotos_textpbeditions_test2_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Maps); i {
+			switch v := v.(*Enums); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2571,7 +2820,7 @@ func file_internal_testprotos_textpbeditions_test2_proto_init() {
 			}
 		}
 		file_internal_testprotos_textpbeditions_test2_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Nested); i {
+			switch v := v.(*Repeats); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2583,7 +2832,7 @@ func file_internal_testprotos_textpbeditions_test2_proto_init() {
 			}
 		}
 		file_internal_testprotos_textpbeditions_test2_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Nests); i {
+			switch v := v.(*Maps); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2595,7 +2844,7 @@ func file_internal_testprotos_textpbeditions_test2_proto_init() {
 			}
 		}
 		file_internal_testprotos_textpbeditions_test2_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Requireds); i {
+			switch v := v.(*Nested); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2607,7 +2856,7 @@ func file_internal_testprotos_textpbeditions_test2_proto_init() {
 			}
 		}
 		file_internal_testprotos_textpbeditions_test2_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*PartialRequired); i {
+			switch v := v.(*Nests); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2619,7 +2868,7 @@ func file_internal_testprotos_textpbeditions_test2_proto_init() {
 			}
 		}
 		file_internal_testprotos_textpbeditions_test2_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*NestedWithRequired); i {
+			switch v := v.(*Requireds); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2631,7 +2880,7 @@ func file_internal_testprotos_textpbeditions_test2_proto_init() {
 			}
 		}
 		file_internal_testprotos_textpbeditions_test2_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*IndirectRequired); i {
+			switch v := v.(*PartialRequired); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -2643,6 +2892,30 @@ func file_internal_testprotos_textpbeditions_test2_proto_init() {
 			}
 		}
 		file_internal_testprotos_textpbeditions_test2_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*NestedWithRequired); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_internal_testprotos_textpbeditions_test2_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*IndirectRequired); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_internal_testprotos_textpbeditions_test2_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Extensions); i {
 			case 0:
 				return &v.state
@@ -2656,7 +2929,7 @@ func file_internal_testprotos_textpbeditions_test2_proto_init() {
 				return nil
 			}
 		}
-		file_internal_testprotos_textpbeditions_test2_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
+		file_internal_testprotos_textpbeditions_test2_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*ExtensionsContainer); i {
 			case 0:
 				return &v.state
@@ -2668,7 +2941,7 @@ func file_internal_testprotos_textpbeditions_test2_proto_init() {
 				return nil
 			}
 		}
-		file_internal_testprotos_textpbeditions_test2_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
+		file_internal_testprotos_textpbeditions_test2_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*MessageSet); i {
 			case 0:
 				return &v.state
@@ -2682,7 +2955,7 @@ func file_internal_testprotos_textpbeditions_test2_proto_init() {
 				return nil
 			}
 		}
-		file_internal_testprotos_textpbeditions_test2_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
+		file_internal_testprotos_textpbeditions_test2_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*MessageSetExtension); i {
 			case 0:
 				return &v.state
@@ -2694,7 +2967,7 @@ func file_internal_testprotos_textpbeditions_test2_proto_init() {
 				return nil
 			}
 		}
-		file_internal_testprotos_textpbeditions_test2_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
+		file_internal_testprotos_textpbeditions_test2_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*FakeMessageSet); i {
 			case 0:
 				return &v.state
@@ -2708,7 +2981,7 @@ func file_internal_testprotos_textpbeditions_test2_proto_init() {
 				return nil
 			}
 		}
-		file_internal_testprotos_textpbeditions_test2_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
+		file_internal_testprotos_textpbeditions_test2_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*FakeMessageSetExtension); i {
 			case 0:
 				return &v.state
@@ -2720,7 +2993,7 @@ func file_internal_testprotos_textpbeditions_test2_proto_init() {
 				return nil
 			}
 		}
-		file_internal_testprotos_textpbeditions_test2_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
+		file_internal_testprotos_textpbeditions_test2_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*KnownTypes); i {
 			case 0:
 				return &v.state
@@ -2732,7 +3005,7 @@ func file_internal_testprotos_textpbeditions_test2_proto_init() {
 				return nil
 			}
 		}
-		file_internal_testprotos_textpbeditions_test2_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
+		file_internal_testprotos_textpbeditions_test2_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Nests_OptGroup); i {
 			case 0:
 				return &v.state
@@ -2744,7 +3017,7 @@ func file_internal_testprotos_textpbeditions_test2_proto_init() {
 				return nil
 			}
 		}
-		file_internal_testprotos_textpbeditions_test2_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
+		file_internal_testprotos_textpbeditions_test2_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Nests_RptGroup); i {
 			case 0:
 				return &v.state
@@ -2756,7 +3029,7 @@ func file_internal_testprotos_textpbeditions_test2_proto_init() {
 				return nil
 			}
 		}
-		file_internal_testprotos_textpbeditions_test2_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
+		file_internal_testprotos_textpbeditions_test2_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Nests_OptGroup_OptNestedGroup); i {
 			case 0:
 				return &v.state
@@ -2769,7 +3042,7 @@ func file_internal_testprotos_textpbeditions_test2_proto_init() {
 			}
 		}
 	}
-	file_internal_testprotos_textpbeditions_test2_proto_msgTypes[10].OneofWrappers = []interface{}{
+	file_internal_testprotos_textpbeditions_test2_proto_msgTypes[12].OneofWrappers = []interface{}{
 		(*IndirectRequired_OneofNested)(nil),
 	}
 	type x struct{}
@@ -2777,8 +3050,8 @@ func file_internal_testprotos_textpbeditions_test2_proto_init() {
 		File: protoimpl.DescBuilder{
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_internal_testprotos_textpbeditions_test2_proto_rawDesc,
-			NumEnums:      2,
-			NumMessages:   24,
+			NumEnums:      4,
+			NumMessages:   26,
 			NumExtensions: 21,
 			NumServices:   0,
 		},
diff --git a/internal/testprotos/textpbeditions/test2.proto b/internal/testprotos/textpbeditions/test2.proto
index 079f0897..286663e2 100644
--- a/internal/testprotos/textpbeditions/test2.proto
+++ b/internal/testprotos/textpbeditions/test2.proto
@@ -17,6 +17,7 @@ import "google/protobuf/wrappers.proto";
 
 option go_package = "google.golang.org/protobuf/internal/testprotos/textpbeditions";
 option features.enum_type = CLOSED;
+option features.utf8_validation = NONE;
 
 // Scalars contains scalar fields.
 message Scalars {
@@ -74,18 +75,46 @@ enum Enum {
   TEN = 10;
 }
 
+enum OpenEnum {
+  option features.enum_type = OPEN;
+
+  UNKNOWN = 0;
+  EINS = 1;
+  ZWEI = 2;
+  ZEHN = 10;
+}
+
+message UTF8Validated {
+  string validated_string = 1
+      [features.utf8_validation = VERIFY, features.field_presence = IMPLICIT];
+}
+
+message NestsUTF8Validated {
+  UTF8Validated validated_message = 1;
+}
+
 // Message contains enum fields.
 message Enums {
   Enum opt_enum = 1;
   repeated Enum rpt_enum = 2;
+  OpenEnum implicit_enum = 5 [features.field_presence = IMPLICIT];
 
   enum NestedEnum {
     UNO = 1;
     DOS = 2;
     DIEZ = 10;
   }
+  enum NestedOpenEnum {
+    option features.enum_type = OPEN;
+
+    UNKNOWN = 0;
+    EINS = 1;
+    ZWEI = 2;
+    ZEHN = 10;
+  }
   NestedEnum opt_nested_enum = 3;
   repeated NestedEnum rpt_nested_enum = 4;
+  NestedOpenEnum implicit_nested_enum = 6 [features.field_presence = IMPLICIT];
 }
 
 // Message contains repeated fields.