diff --git a/cmd/convert.go b/cmd/convert.go index 6bfb6d1..98042eb 100644 --- a/cmd/convert.go +++ b/cmd/convert.go @@ -25,6 +25,7 @@ SOFTWARE. package cmd import ( + "errors" "fmt" "os" @@ -50,6 +51,7 @@ func createConvertCommand() (c *cobra.Command) { "The file pattern which try to execute the test cases. Brace expansion is supported, such as: test-suite-{1,2}.yaml") flags.StringVarP(&opt.converter, "converter", "", "", fmt.Sprintf("The converter format, supported: %s", util.Keys(converters))) + flags.StringVarP(&opt.source, "source", "", "", "The source format, supported: postman") flags.StringVarP(&opt.target, "target", "t", "", "The target file path") _ = c.MarkFlagRequired("pattern") @@ -60,11 +62,21 @@ func createConvertCommand() (c *cobra.Command) { type convertOption struct { pattern string converter string + source string target string } func (o *convertOption) preRunE(c *cobra.Command, args []string) (err error) { - o.target = util.EmptyThenDefault(o.target, "sample.jmx") + switch o.source { + case "postman": + o.target = util.EmptyThenDefault(o.target, "sample.yaml") + o.converter = "raw" + case "": + o.target = util.EmptyThenDefault(o.target, "sample.jmx") + default: + err = errors.New("only postman supported") + } + return } @@ -74,23 +86,41 @@ func (o *convertOption) runE(c *cobra.Command, args []string) (err error) { return } - var output string - var suites []testing.TestSuite - if suites, err = loader.ListTestSuite(); err == nil { - if len(suites) == 0 { - err = fmt.Errorf("no suites found") - } else { - converter := generator.GetTestSuiteConverter(o.converter) - if converter == nil { - err = fmt.Errorf("no converter found") - } else { - output, err = converter.Convert(&suites[0]) - } - } + var suite *testing.TestSuite + if o.source == "" { + suite, err = getSuiteFromFile(o.pattern) + } else { + suite, err = generator.NewPostmanImporter().ConvertFromFile(o.pattern) } - if output != "" { - err = os.WriteFile(o.target, []byte(output), 0644) + if err != nil { + return + } + + converter := generator.GetTestSuiteConverter(o.converter) + if converter == nil { + err = fmt.Errorf("no converter found") + } else { + var output string + output, err = converter.Convert(suite) + if output != "" { + err = os.WriteFile(o.target, []byte(output), 0644) + } + } + return +} + +func getSuiteFromFile(pattern string) (suite *testing.TestSuite, err error) { + loader := testing.NewFileWriter("") + if err = loader.Put(pattern); err == nil { + var suites []testing.TestSuite + if suites, err = loader.ListTestSuite(); err == nil { + if len(suites) > 0 { + suite = &suites[0] + } else { + err = errors.New("no suites found") + } + } } return } diff --git a/cmd/convert_test.go b/cmd/convert_test.go index 5e06dba..9a2b76d 100644 --- a/cmd/convert_test.go +++ b/cmd/convert_test.go @@ -25,6 +25,7 @@ SOFTWARE. package cmd_test import ( + _ "embed" "io" "os" "path" @@ -85,4 +86,19 @@ func TestConvert(t *testing.T) { err := c.Execute() assert.Error(t, err) }) + + t.Run("not supported source format", func(t *testing.T) { + c.SetArgs([]string{"convert", "--source=fake"}) + err := c.Execute() + assert.Error(t, err) + }) + + t.Run("convert from postmant", func(t *testing.T) { + tmpFile := path.Join(os.TempDir(), time.Now().String()) + defer os.RemoveAll(tmpFile) + + c.SetArgs([]string{"convert", "--source=postman", "--target=", tmpFile, "-p=testdata/postman.json"}) + err := c.Execute() + assert.NoError(t, err) + }) } diff --git a/cmd/function_test.go b/cmd/function_test.go index 7c5b60b..af061cc 100644 --- a/cmd/function_test.go +++ b/cmd/function_test.go @@ -1,3 +1,27 @@ +/** +MIT License + +Copyright (c) 2023 API Testing Authors. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + package cmd_test import ( diff --git a/cmd/testdata/postman.json b/cmd/testdata/postman.json new file mode 100644 index 0000000..eede993 --- /dev/null +++ b/cmd/testdata/postman.json @@ -0,0 +1,35 @@ +{ + "info": { + "_postman_id": "0da1f6bf-fdbb-46a5-ac46-873564e2259c", + "name": "New Collection", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", + "_exporter_id": "6795120", + "_collection_link": "https://www.postman.com/ks-devops/workspace/kubesphere-devops/collection/6795120-0da1f6bf-fdbb-46a5-ac46-873564e2259c?action=share&creator=6795120&source=collection_link" + }, + "item": [ + { + "name": "New Request", + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "method": "GET", + "header": [ + { + "key": "key", + "value": "value", + "description": "description", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{}" + }, + "url": { + "raw": "http://localhost?key=value" + } + } + } + ] +} \ No newline at end of file diff --git a/console/atest-ui/src/App.vue b/console/atest-ui/src/App.vue index aec8090..a40e183 100644 --- a/console/atest-ui/src/App.vue +++ b/console/atest-ui/src/App.vue @@ -137,6 +137,7 @@ function loadStores() { loadStores() const dialogVisible = ref(false) +const importDialogVisible = ref(false) const suiteCreatingLoading = ref(false) const suiteFormRef = ref() const testSuiteForm = reactive({ @@ -144,20 +145,27 @@ const testSuiteForm = reactive({ api: '', store: '' }) +const importSuiteFormRef = ref() +const importSuiteForm = reactive({ + url: '', + store: '' +}) function openTestSuiteCreateDialog() { dialogVisible.value = true } +function openTestSuiteImportDialog() { + importDialogVisible.value = true +} + const rules = reactive>({ name: [{ required: true, message: 'Name is required', trigger: 'blur' }], store: [{ required: true, message: 'Location is required', trigger: 'blur' }] }) const submitForm = async (formEl: FormInstance | undefined) => { if (!formEl) return - console.log(formEl) await formEl.validate((valid: boolean, fields) => { - console.log(valid, fields) if (valid) { suiteCreatingLoading.value = true @@ -184,6 +192,40 @@ const submitForm = async (formEl: FormInstance | undefined) => { }) } +const importSuiteFormRules = reactive>({ + url: [ + { required: true, message: 'URL is required', trigger: 'blur' }, + { type: 'url', message: 'Should be a valid URL value', trigger: 'blur' } + ], + store: [{ required: true, message: 'Location is required', trigger: 'blur' }] +}) +const importSuiteFormSubmit = async (formEl: FormInstance | undefined) => { + if (!formEl) return + await formEl.validate((valid: boolean, fields) => { + if (valid) { + suiteCreatingLoading.value = true + + const requestOptions = { + method: 'POST', + headers: { + 'X-Store-Name': importSuiteForm.store + }, + body: JSON.stringify({ + url: importSuiteForm.url + }) + } + + fetch('/server.Runner/ImportTestSuite', requestOptions) + .then((response) => response.json()) + .then(() => { + loadStores() + importDialogVisible.value = false + formEl.resetFields() + }) + } + }) +} + const filterText = ref('') watch(filterText, (val) => { treeRef.value!.filter(val) @@ -209,6 +251,9 @@ const viewName = ref('testcase') New + Import + + + + diff --git a/pkg/generator/importer.go b/pkg/generator/importer.go new file mode 100644 index 0000000..60001d2 --- /dev/null +++ b/pkg/generator/importer.go @@ -0,0 +1,168 @@ +/** +MIT License + +Copyright (c) 2023 API Testing Authors. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +package generator + +import ( + "encoding/json" + "io" + "net/http" + "os" + + "github.com/linuxsuren/api-testing/pkg/testing" +) + +type PostmanCollection struct { + Collection Postman `json:"collection"` +} + +type Postman struct { + Info PostmanInfo `json:"info"` + Item []PostmanItem `json:"item"` +} + +type PostmanInfo struct { + Name string +} + +type PostmanItem struct { + Name string `json:"name"` + Request PostmanRequest `json:"request"` + Item []PostmanItem `json:"item"` +} + +type PostmanRequest struct { + Method string `json:"method"` + URL PostmanURL `json:"url"` + Header Paris `json:"header"` + Body PostmanBody `json:"body"` +} + +type PostmanBody struct { + Mode string `json:"mode"` + Raw string `json:"raw"` +} + +type PostmanURL struct { + Raw string `json:"raw"` + Path []string `json:"path"` + Query Paris `json:"query"` +} + +type Paris []Pair +type Pair struct { + Key string `json:"key"` + Value string `json:"value"` +} + +func (p Paris) ToMap() (result map[string]string) { + count := len(p) + if count == 0 { + return + } + result = make(map[string]string, count) + for _, item := range p { + result[item.Key] = item.Value + } + return +} + +type Importer interface { + Convert(data []byte) (*testing.TestSuite, error) + ConvertFromFile(dataFile string) (*testing.TestSuite, error) + ConvertFromURL(dataURL string) (*testing.TestSuite, error) +} + +type postmanImporter struct { +} + +// NewPostmanImporter returns a new postman importer +func NewPostmanImporter() Importer { + return &postmanImporter{} +} + +// Convert converts the postman data to test suite +func (p *postmanImporter) Convert(data []byte) (suite *testing.TestSuite, err error) { + postman := &Postman{} + if err = json.Unmarshal(data, postman); err != nil { + return + } + if postman.Info.Name == "" { + postmanCollection := &PostmanCollection{} + if err = json.Unmarshal(data, postmanCollection); err != nil { + return + } + postman = &postmanCollection.Collection + } + + suite = &testing.TestSuite{} + suite.Name = postman.Info.Name + suite.Items = make([]testing.TestCase, len(postman.Item)) + + for i, item := range postman.Item { + if len(item.Item) == 0 { + suite.Items[i] = testing.TestCase{ + Name: item.Name, + Request: testing.Request{ + Method: item.Request.Method, + API: item.Request.URL.Raw, + Body: item.Request.Body.Raw, + Header: item.Request.Header.ToMap(), + }, + } + } else { + for _, sub := range item.Item { + suite.Items[i] = testing.TestCase{ + Name: item.Name + " " + sub.Name, + Request: testing.Request{ + Method: sub.Request.Method, + API: sub.Request.URL.Raw, + Body: sub.Request.Body.Raw, + Header: sub.Request.Header.ToMap(), + }, + } + } + } + } + return +} + +func (p *postmanImporter) ConvertFromFile(dataFile string) (suite *testing.TestSuite, err error) { + var data []byte + if data, err = os.ReadFile(dataFile); err == nil { + suite, err = p.Convert(data) + } + return +} + +func (p *postmanImporter) ConvertFromURL(dataURL string) (suite *testing.TestSuite, err error) { + var resp *http.Response + if resp, err = http.Get(dataURL); err == nil { + var data []byte + if data, err = io.ReadAll(resp.Body); err == nil { + suite, err = p.Convert(data) + } + } + return +} diff --git a/pkg/generator/importer_test.go b/pkg/generator/importer_test.go new file mode 100644 index 0000000..49249d8 --- /dev/null +++ b/pkg/generator/importer_test.go @@ -0,0 +1,107 @@ +/** +MIT License + +Copyright (c) 2023 API Testing Authors. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +package generator + +import ( + "net/http" + "strings" + "testing" + + _ "embed" + + "github.com/h2non/gock" + "github.com/stretchr/testify/assert" +) + +func TestPostmanImport(t *testing.T) { + importer := NewPostmanImporter() + + converter := GetTestSuiteConverter("raw") + if !assert.NotNil(t, converter) { + return + } + + t.Run("empty", func(t *testing.T) { + suite, err := importer.Convert([]byte(emptyJSON)) + assert.NoError(t, err) + + var result string + result, err = converter.Convert(suite) + assert.NoError(t, err) + assert.Equal(t, emptyJSON, strings.TrimSpace(result)) + }) + + t.Run("simple postman, from []byte", func(t *testing.T) { + suite, err := importer.Convert([]byte(simplePostman)) + assert.NoError(t, err) + + var result string + result, err = converter.Convert(suite) + assert.NoError(t, err) + assert.Equal(t, expectedSuiteFromPostman, strings.TrimSpace(result), result) + }) + + t.Run("simple postman, from file", func(t *testing.T) { + suite, err := importer.ConvertFromFile("testdata/postman.json") + assert.NoError(t, err) + + var result string + result, err = converter.Convert(suite) + assert.NoError(t, err) + assert.Equal(t, expectedSuiteFromPostman, strings.TrimSpace(result), result) + }) + + t.Run("simple postman, from URl", func(t *testing.T) { + defer gock.Off() + gock.New(urlFoo).Get("/").Reply(http.StatusOK).BodyString(simplePostman) + + suite, err := importer.ConvertFromURL(urlFoo) + assert.NoError(t, err) + + var result string + result, err = converter.Convert(suite) + assert.NoError(t, err) + assert.Equal(t, expectedSuiteFromPostman, strings.TrimSpace(result), result) + }) + + t.Run("nil data", func(t *testing.T) { + _, err := importer.Convert(nil) + assert.Error(t, err) + }) + + t.Run("pairs toMap", func(t *testing.T) { + pairs := Paris{} + assert.Equal(t, 0, len(pairs.ToMap())) + }) +} + +const emptyJSON = "{}" +const urlFoo = "http://foo" + +//go:embed testdata/postman.json +var simplePostman string + +//go:embed testdata/expected_suite_from_postman.yaml +var expectedSuiteFromPostman string diff --git a/pkg/generator/testdata/expected_suite_from_postman.yaml b/pkg/generator/testdata/expected_suite_from_postman.yaml new file mode 100644 index 0000000..8be85aa --- /dev/null +++ b/pkg/generator/testdata/expected_suite_from_postman.yaml @@ -0,0 +1,9 @@ +name: New Collection +items: + - name: New Request + request: + api: http://localhost?key=value + method: GET + header: + key: value + body: '{}' \ No newline at end of file diff --git a/pkg/generator/testdata/postman.json b/pkg/generator/testdata/postman.json new file mode 100644 index 0000000..eede993 --- /dev/null +++ b/pkg/generator/testdata/postman.json @@ -0,0 +1,35 @@ +{ + "info": { + "_postman_id": "0da1f6bf-fdbb-46a5-ac46-873564e2259c", + "name": "New Collection", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", + "_exporter_id": "6795120", + "_collection_link": "https://www.postman.com/ks-devops/workspace/kubesphere-devops/collection/6795120-0da1f6bf-fdbb-46a5-ac46-873564e2259c?action=share&creator=6795120&source=collection_link" + }, + "item": [ + { + "name": "New Request", + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "method": "GET", + "header": [ + { + "key": "key", + "value": "value", + "description": "description", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{}" + }, + "url": { + "raw": "http://localhost?key=value" + } + } + } + ] +} \ No newline at end of file diff --git a/pkg/server/remote_server.go b/pkg/server/remote_server.go index 6917ade..ba21f3a 100644 --- a/pkg/server/remote_server.go +++ b/pkg/server/remote_server.go @@ -1,3 +1,27 @@ +/** +MIT License + +Copyright (c) 2023 API Testing Authors. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + // Package server provides a GRPC based server package server @@ -265,6 +289,45 @@ func (s *server) CreateTestSuite(ctx context.Context, in *TestSuiteIdentity) (re return } +func (s *server) ImportTestSuite(ctx context.Context, in *TestSuiteSource) (result *CommonResult, err error) { + result = &CommonResult{} + if in.Kind != "postman" && in.Kind != "" { + result.Success = false + result.Message = fmt.Sprintf("not support kind: %s", in.Kind) + return + } + + var suite *testing.TestSuite + importer := generator.NewPostmanImporter() + if in.Url != "" { + suite, err = importer.ConvertFromURL(in.Url) + } else if in.Data != "" { + suite, err = importer.Convert([]byte(in.Data)) + } else { + err = errors.New("url or data is required") + } + + if err != nil { + result.Success = false + result.Message = err.Error() + return + } + + loader := s.getLoader(ctx) + + if err = loader.CreateSuite(suite.Name, suite.API); err != nil { + return + } + + for _, item := range suite.Items { + if err = loader.CreateTestCase(suite.Name, item); err != nil { + break + } + } + result.Success = true + return +} + func (s *server) GetTestSuite(ctx context.Context, in *TestSuiteIdentity) (result *TestSuite, err error) { loader := s.getLoader(ctx) var suite *testing.TestSuite diff --git a/pkg/server/remote_server_test.go b/pkg/server/remote_server_test.go index 0192547..f5b4436 100644 --- a/pkg/server/remote_server_test.go +++ b/pkg/server/remote_server_test.go @@ -1,3 +1,27 @@ +/** +MIT License + +Copyright (c) 2023 API Testing Authors. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + package server import ( @@ -626,6 +650,42 @@ func TestCodeGenerator(t *testing.T) { assert.True(t, reply.Success) } }) + + t.Run("ImportTestSuite, url or data is required", func(t *testing.T) { + result, err := server.ImportTestSuite(ctx, &TestSuiteSource{}) + assert.Error(t, err) + assert.False(t, result.Success) + assert.Equal(t, "url or data is required", result.Message) + }) + + t.Run("ImportTestSuite, invalid kind", func(t *testing.T) { + result, err := server.ImportTestSuite(ctx, &TestSuiteSource{Kind: "fake"}) + assert.NoError(t, err) + assert.False(t, result.Success) + assert.Equal(t, "not support kind: fake", result.Message) + }) + + t.Run("ImportTestSuite, import from string", func(t *testing.T) { + result, err := server.ImportTestSuite(ctx, &TestSuiteSource{ + Kind: "postman", + Data: simplePostman, + }) + assert.NoError(t, err) + assert.True(t, result.Success) + }) + + t.Run("ImportTestSuite, import from URL", func(t *testing.T) { + defer gock.Off() + gock.New(urlFoo).Get("/").Reply(http.StatusOK).BodyString(simplePostman) + + // already exist + result, err := server.ImportTestSuite(ctx, &TestSuiteSource{ + Kind: "postman", + Url: urlFoo, + }) + assert.Error(t, err) + assert.False(t, result.Success) + }) } func TestFunctionsQueryStream(t *testing.T) { @@ -764,6 +824,9 @@ var simpleSuite string //go:embed testdata/simple_testcase.yaml var simpleTestCase string +//go:embed testdata/postman.json +var simplePostman string + const urlFoo = "http://foo" type fakeServerStream struct { diff --git a/pkg/server/server.pb.go b/pkg/server/server.pb.go index f75f610..2a3326a 100644 --- a/pkg/server/server.pb.go +++ b/pkg/server/server.pb.go @@ -169,6 +169,69 @@ func (x *TestCaseIdentity) GetTestcase() string { return "" } +type TestSuiteSource struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` + Url string `protobuf:"bytes,2,opt,name=url,proto3" json:"url,omitempty"` + Data string `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` +} + +func (x *TestSuiteSource) Reset() { + *x = TestSuiteSource{} + if protoimpl.UnsafeEnabled { + mi := &file_pkg_server_server_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TestSuiteSource) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TestSuiteSource) ProtoMessage() {} + +func (x *TestSuiteSource) ProtoReflect() protoreflect.Message { + mi := &file_pkg_server_server_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 TestSuiteSource.ProtoReflect.Descriptor instead. +func (*TestSuiteSource) Descriptor() ([]byte, []int) { + return file_pkg_server_server_proto_rawDescGZIP(), []int{3} +} + +func (x *TestSuiteSource) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *TestSuiteSource) GetUrl() string { + if x != nil { + return x.Url + } + return "" +} + +func (x *TestSuiteSource) GetData() string { + if x != nil { + return x.Data + } + return "" +} + type TestSuite struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -183,7 +246,7 @@ type TestSuite struct { func (x *TestSuite) Reset() { *x = TestSuite{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_server_server_proto_msgTypes[3] + mi := &file_pkg_server_server_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -196,7 +259,7 @@ func (x *TestSuite) String() string { func (*TestSuite) ProtoMessage() {} func (x *TestSuite) ProtoReflect() protoreflect.Message { - mi := &file_pkg_server_server_proto_msgTypes[3] + mi := &file_pkg_server_server_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -209,7 +272,7 @@ func (x *TestSuite) ProtoReflect() protoreflect.Message { // Deprecated: Use TestSuite.ProtoReflect.Descriptor instead. func (*TestSuite) Descriptor() ([]byte, []int) { - return file_pkg_server_server_proto_rawDescGZIP(), []int{3} + return file_pkg_server_server_proto_rawDescGZIP(), []int{4} } func (x *TestSuite) GetName() string { @@ -252,7 +315,7 @@ type APISpec struct { func (x *APISpec) Reset() { *x = APISpec{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_server_server_proto_msgTypes[4] + mi := &file_pkg_server_server_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -265,7 +328,7 @@ func (x *APISpec) String() string { func (*APISpec) ProtoMessage() {} func (x *APISpec) ProtoReflect() protoreflect.Message { - mi := &file_pkg_server_server_proto_msgTypes[4] + mi := &file_pkg_server_server_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -278,7 +341,7 @@ func (x *APISpec) ProtoReflect() protoreflect.Message { // Deprecated: Use APISpec.ProtoReflect.Descriptor instead. func (*APISpec) Descriptor() ([]byte, []int) { - return file_pkg_server_server_proto_rawDescGZIP(), []int{4} + return file_pkg_server_server_proto_rawDescGZIP(), []int{5} } func (x *APISpec) GetKind() string { @@ -307,7 +370,7 @@ type TestSuiteIdentity struct { func (x *TestSuiteIdentity) Reset() { *x = TestSuiteIdentity{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_server_server_proto_msgTypes[5] + mi := &file_pkg_server_server_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -320,7 +383,7 @@ func (x *TestSuiteIdentity) String() string { func (*TestSuiteIdentity) ProtoMessage() {} func (x *TestSuiteIdentity) ProtoReflect() protoreflect.Message { - mi := &file_pkg_server_server_proto_msgTypes[5] + mi := &file_pkg_server_server_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -333,7 +396,7 @@ func (x *TestSuiteIdentity) ProtoReflect() protoreflect.Message { // Deprecated: Use TestSuiteIdentity.ProtoReflect.Descriptor instead. func (*TestSuiteIdentity) Descriptor() ([]byte, []int) { - return file_pkg_server_server_proto_rawDescGZIP(), []int{5} + return file_pkg_server_server_proto_rawDescGZIP(), []int{6} } func (x *TestSuiteIdentity) GetName() string { @@ -365,7 +428,7 @@ type TestTask struct { func (x *TestTask) Reset() { *x = TestTask{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_server_server_proto_msgTypes[6] + mi := &file_pkg_server_server_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -378,7 +441,7 @@ func (x *TestTask) String() string { func (*TestTask) ProtoMessage() {} func (x *TestTask) ProtoReflect() protoreflect.Message { - mi := &file_pkg_server_server_proto_msgTypes[6] + mi := &file_pkg_server_server_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -391,7 +454,7 @@ func (x *TestTask) ProtoReflect() protoreflect.Message { // Deprecated: Use TestTask.ProtoReflect.Descriptor instead. func (*TestTask) Descriptor() ([]byte, []int) { - return file_pkg_server_server_proto_rawDescGZIP(), []int{6} + return file_pkg_server_server_proto_rawDescGZIP(), []int{7} } func (x *TestTask) GetData() string { @@ -442,7 +505,7 @@ type TestResult struct { func (x *TestResult) Reset() { *x = TestResult{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_server_server_proto_msgTypes[7] + mi := &file_pkg_server_server_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -455,7 +518,7 @@ func (x *TestResult) String() string { func (*TestResult) ProtoMessage() {} func (x *TestResult) ProtoReflect() protoreflect.Message { - mi := &file_pkg_server_server_proto_msgTypes[7] + mi := &file_pkg_server_server_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -468,7 +531,7 @@ func (x *TestResult) ProtoReflect() protoreflect.Message { // Deprecated: Use TestResult.ProtoReflect.Descriptor instead. func (*TestResult) Descriptor() ([]byte, []int) { - return file_pkg_server_server_proto_rawDescGZIP(), []int{7} + return file_pkg_server_server_proto_rawDescGZIP(), []int{8} } func (x *TestResult) GetMessage() string { @@ -504,7 +567,7 @@ type HelloReply struct { func (x *HelloReply) Reset() { *x = HelloReply{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_server_server_proto_msgTypes[8] + mi := &file_pkg_server_server_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -517,7 +580,7 @@ func (x *HelloReply) String() string { func (*HelloReply) ProtoMessage() {} func (x *HelloReply) ProtoReflect() protoreflect.Message { - mi := &file_pkg_server_server_proto_msgTypes[8] + mi := &file_pkg_server_server_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -530,7 +593,7 @@ func (x *HelloReply) ProtoReflect() protoreflect.Message { // Deprecated: Use HelloReply.ProtoReflect.Descriptor instead. func (*HelloReply) Descriptor() ([]byte, []int) { - return file_pkg_server_server_proto_rawDescGZIP(), []int{8} + return file_pkg_server_server_proto_rawDescGZIP(), []int{9} } func (x *HelloReply) GetMessage() string { @@ -560,7 +623,7 @@ type Suite struct { func (x *Suite) Reset() { *x = Suite{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_server_server_proto_msgTypes[9] + mi := &file_pkg_server_server_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -573,7 +636,7 @@ func (x *Suite) String() string { func (*Suite) ProtoMessage() {} func (x *Suite) ProtoReflect() protoreflect.Message { - mi := &file_pkg_server_server_proto_msgTypes[9] + mi := &file_pkg_server_server_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -586,7 +649,7 @@ func (x *Suite) ProtoReflect() protoreflect.Message { // Deprecated: Use Suite.ProtoReflect.Descriptor instead. func (*Suite) Descriptor() ([]byte, []int) { - return file_pkg_server_server_proto_rawDescGZIP(), []int{9} + return file_pkg_server_server_proto_rawDescGZIP(), []int{10} } func (x *Suite) GetName() string { @@ -622,7 +685,7 @@ type TestCaseWithSuite struct { func (x *TestCaseWithSuite) Reset() { *x = TestCaseWithSuite{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_server_server_proto_msgTypes[10] + mi := &file_pkg_server_server_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -635,7 +698,7 @@ func (x *TestCaseWithSuite) String() string { func (*TestCaseWithSuite) ProtoMessage() {} func (x *TestCaseWithSuite) ProtoReflect() protoreflect.Message { - mi := &file_pkg_server_server_proto_msgTypes[10] + mi := &file_pkg_server_server_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -648,7 +711,7 @@ func (x *TestCaseWithSuite) ProtoReflect() protoreflect.Message { // Deprecated: Use TestCaseWithSuite.ProtoReflect.Descriptor instead. func (*TestCaseWithSuite) Descriptor() ([]byte, []int) { - return file_pkg_server_server_proto_rawDescGZIP(), []int{10} + return file_pkg_server_server_proto_rawDescGZIP(), []int{11} } func (x *TestCaseWithSuite) GetSuiteName() string { @@ -676,7 +739,7 @@ type TestCases struct { func (x *TestCases) Reset() { *x = TestCases{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_server_server_proto_msgTypes[11] + mi := &file_pkg_server_server_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -689,7 +752,7 @@ func (x *TestCases) String() string { func (*TestCases) ProtoMessage() {} func (x *TestCases) ProtoReflect() protoreflect.Message { - mi := &file_pkg_server_server_proto_msgTypes[11] + mi := &file_pkg_server_server_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -702,7 +765,7 @@ func (x *TestCases) ProtoReflect() protoreflect.Message { // Deprecated: Use TestCases.ProtoReflect.Descriptor instead. func (*TestCases) Descriptor() ([]byte, []int) { - return file_pkg_server_server_proto_rawDescGZIP(), []int{11} + return file_pkg_server_server_proto_rawDescGZIP(), []int{12} } func (x *TestCases) GetData() []*TestCase { @@ -726,7 +789,7 @@ type TestCase struct { func (x *TestCase) Reset() { *x = TestCase{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_server_server_proto_msgTypes[12] + mi := &file_pkg_server_server_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -739,7 +802,7 @@ func (x *TestCase) String() string { func (*TestCase) ProtoMessage() {} func (x *TestCase) ProtoReflect() protoreflect.Message { - mi := &file_pkg_server_server_proto_msgTypes[12] + mi := &file_pkg_server_server_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -752,7 +815,7 @@ func (x *TestCase) ProtoReflect() protoreflect.Message { // Deprecated: Use TestCase.ProtoReflect.Descriptor instead. func (*TestCase) Descriptor() ([]byte, []int) { - return file_pkg_server_server_proto_rawDescGZIP(), []int{12} + return file_pkg_server_server_proto_rawDescGZIP(), []int{13} } func (x *TestCase) GetName() string { @@ -799,7 +862,7 @@ type Request struct { func (x *Request) Reset() { *x = Request{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_server_server_proto_msgTypes[13] + mi := &file_pkg_server_server_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -812,7 +875,7 @@ func (x *Request) String() string { func (*Request) ProtoMessage() {} func (x *Request) ProtoReflect() protoreflect.Message { - mi := &file_pkg_server_server_proto_msgTypes[13] + mi := &file_pkg_server_server_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -825,7 +888,7 @@ func (x *Request) ProtoReflect() protoreflect.Message { // Deprecated: Use Request.ProtoReflect.Descriptor instead. func (*Request) Descriptor() ([]byte, []int) { - return file_pkg_server_server_proto_rawDescGZIP(), []int{13} + return file_pkg_server_server_proto_rawDescGZIP(), []int{14} } func (x *Request) GetApi() string { @@ -886,7 +949,7 @@ type Response struct { func (x *Response) Reset() { *x = Response{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_server_server_proto_msgTypes[14] + mi := &file_pkg_server_server_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -899,7 +962,7 @@ func (x *Response) String() string { func (*Response) ProtoMessage() {} func (x *Response) ProtoReflect() protoreflect.Message { - mi := &file_pkg_server_server_proto_msgTypes[14] + mi := &file_pkg_server_server_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -912,7 +975,7 @@ func (x *Response) ProtoReflect() protoreflect.Message { // Deprecated: Use Response.ProtoReflect.Descriptor instead. func (*Response) Descriptor() ([]byte, []int) { - return file_pkg_server_server_proto_rawDescGZIP(), []int{14} + return file_pkg_server_server_proto_rawDescGZIP(), []int{15} } func (x *Response) GetStatusCode() int32 { @@ -973,7 +1036,7 @@ type TestCaseResult struct { func (x *TestCaseResult) Reset() { *x = TestCaseResult{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_server_server_proto_msgTypes[15] + mi := &file_pkg_server_server_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -986,7 +1049,7 @@ func (x *TestCaseResult) String() string { func (*TestCaseResult) ProtoMessage() {} func (x *TestCaseResult) ProtoReflect() protoreflect.Message { - mi := &file_pkg_server_server_proto_msgTypes[15] + mi := &file_pkg_server_server_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -999,7 +1062,7 @@ func (x *TestCaseResult) ProtoReflect() protoreflect.Message { // Deprecated: Use TestCaseResult.ProtoReflect.Descriptor instead. func (*TestCaseResult) Descriptor() ([]byte, []int) { - return file_pkg_server_server_proto_rawDescGZIP(), []int{15} + return file_pkg_server_server_proto_rawDescGZIP(), []int{16} } func (x *TestCaseResult) GetStatusCode() int32 { @@ -1056,7 +1119,7 @@ type Pair struct { func (x *Pair) Reset() { *x = Pair{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_server_server_proto_msgTypes[16] + mi := &file_pkg_server_server_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1069,7 +1132,7 @@ func (x *Pair) String() string { func (*Pair) ProtoMessage() {} func (x *Pair) ProtoReflect() protoreflect.Message { - mi := &file_pkg_server_server_proto_msgTypes[16] + mi := &file_pkg_server_server_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1082,7 +1145,7 @@ func (x *Pair) ProtoReflect() protoreflect.Message { // Deprecated: Use Pair.ProtoReflect.Descriptor instead. func (*Pair) Descriptor() ([]byte, []int) { - return file_pkg_server_server_proto_rawDescGZIP(), []int{16} + return file_pkg_server_server_proto_rawDescGZIP(), []int{17} } func (x *Pair) GetKey() string { @@ -1110,7 +1173,7 @@ type Pairs struct { func (x *Pairs) Reset() { *x = Pairs{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_server_server_proto_msgTypes[17] + mi := &file_pkg_server_server_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1123,7 +1186,7 @@ func (x *Pairs) String() string { func (*Pairs) ProtoMessage() {} func (x *Pairs) ProtoReflect() protoreflect.Message { - mi := &file_pkg_server_server_proto_msgTypes[17] + mi := &file_pkg_server_server_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1136,7 +1199,7 @@ func (x *Pairs) ProtoReflect() protoreflect.Message { // Deprecated: Use Pairs.ProtoReflect.Descriptor instead. func (*Pairs) Descriptor() ([]byte, []int) { - return file_pkg_server_server_proto_rawDescGZIP(), []int{17} + return file_pkg_server_server_proto_rawDescGZIP(), []int{18} } func (x *Pairs) GetData() []*Pair { @@ -1157,7 +1220,7 @@ type SimpleQuery struct { func (x *SimpleQuery) Reset() { *x = SimpleQuery{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_server_server_proto_msgTypes[18] + mi := &file_pkg_server_server_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1170,7 +1233,7 @@ func (x *SimpleQuery) String() string { func (*SimpleQuery) ProtoMessage() {} func (x *SimpleQuery) ProtoReflect() protoreflect.Message { - mi := &file_pkg_server_server_proto_msgTypes[18] + mi := &file_pkg_server_server_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1183,7 +1246,7 @@ func (x *SimpleQuery) ProtoReflect() protoreflect.Message { // Deprecated: Use SimpleQuery.ProtoReflect.Descriptor instead. func (*SimpleQuery) Descriptor() ([]byte, []int) { - return file_pkg_server_server_proto_rawDescGZIP(), []int{18} + return file_pkg_server_server_proto_rawDescGZIP(), []int{19} } func (x *SimpleQuery) GetName() string { @@ -1204,7 +1267,7 @@ type Stores struct { func (x *Stores) Reset() { *x = Stores{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_server_server_proto_msgTypes[19] + mi := &file_pkg_server_server_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1217,7 +1280,7 @@ func (x *Stores) String() string { func (*Stores) ProtoMessage() {} func (x *Stores) ProtoReflect() protoreflect.Message { - mi := &file_pkg_server_server_proto_msgTypes[19] + mi := &file_pkg_server_server_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1230,7 +1293,7 @@ func (x *Stores) ProtoReflect() protoreflect.Message { // Deprecated: Use Stores.ProtoReflect.Descriptor instead. func (*Stores) Descriptor() ([]byte, []int) { - return file_pkg_server_server_proto_rawDescGZIP(), []int{19} + return file_pkg_server_server_proto_rawDescGZIP(), []int{20} } func (x *Stores) GetData() []*Store { @@ -1258,7 +1321,7 @@ type Store struct { func (x *Store) Reset() { *x = Store{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_server_server_proto_msgTypes[20] + mi := &file_pkg_server_server_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1271,7 +1334,7 @@ func (x *Store) String() string { func (*Store) ProtoMessage() {} func (x *Store) ProtoReflect() protoreflect.Message { - mi := &file_pkg_server_server_proto_msgTypes[20] + mi := &file_pkg_server_server_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1284,7 +1347,7 @@ func (x *Store) ProtoReflect() protoreflect.Message { // Deprecated: Use Store.ProtoReflect.Descriptor instead. func (*Store) Descriptor() ([]byte, []int) { - return file_pkg_server_server_proto_rawDescGZIP(), []int{20} + return file_pkg_server_server_proto_rawDescGZIP(), []int{21} } func (x *Store) GetName() string { @@ -1354,7 +1417,7 @@ type StoreKinds struct { func (x *StoreKinds) Reset() { *x = StoreKinds{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_server_server_proto_msgTypes[21] + mi := &file_pkg_server_server_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1367,7 +1430,7 @@ func (x *StoreKinds) String() string { func (*StoreKinds) ProtoMessage() {} func (x *StoreKinds) ProtoReflect() protoreflect.Message { - mi := &file_pkg_server_server_proto_msgTypes[21] + mi := &file_pkg_server_server_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1380,7 +1443,7 @@ func (x *StoreKinds) ProtoReflect() protoreflect.Message { // Deprecated: Use StoreKinds.ProtoReflect.Descriptor instead. func (*StoreKinds) Descriptor() ([]byte, []int) { - return file_pkg_server_server_proto_rawDescGZIP(), []int{21} + return file_pkg_server_server_proto_rawDescGZIP(), []int{22} } func (x *StoreKinds) GetData() []*StoreKind { @@ -1402,7 +1465,7 @@ type StoreKind struct { func (x *StoreKind) Reset() { *x = StoreKind{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_server_server_proto_msgTypes[22] + mi := &file_pkg_server_server_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1415,7 +1478,7 @@ func (x *StoreKind) String() string { func (*StoreKind) ProtoMessage() {} func (x *StoreKind) ProtoReflect() protoreflect.Message { - mi := &file_pkg_server_server_proto_msgTypes[22] + mi := &file_pkg_server_server_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1428,7 +1491,7 @@ func (x *StoreKind) ProtoReflect() protoreflect.Message { // Deprecated: Use StoreKind.ProtoReflect.Descriptor instead. func (*StoreKind) Descriptor() ([]byte, []int) { - return file_pkg_server_server_proto_rawDescGZIP(), []int{22} + return file_pkg_server_server_proto_rawDescGZIP(), []int{23} } func (x *StoreKind) GetName() string { @@ -1457,7 +1520,7 @@ type CommonResult struct { func (x *CommonResult) Reset() { *x = CommonResult{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_server_server_proto_msgTypes[23] + mi := &file_pkg_server_server_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1470,7 +1533,7 @@ func (x *CommonResult) String() string { func (*CommonResult) ProtoMessage() {} func (x *CommonResult) ProtoReflect() protoreflect.Message { - mi := &file_pkg_server_server_proto_msgTypes[23] + mi := &file_pkg_server_server_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1483,7 +1546,7 @@ func (x *CommonResult) ProtoReflect() protoreflect.Message { // Deprecated: Use CommonResult.ProtoReflect.Descriptor instead. func (*CommonResult) Descriptor() ([]byte, []int) { - return file_pkg_server_server_proto_rawDescGZIP(), []int{23} + return file_pkg_server_server_proto_rawDescGZIP(), []int{24} } func (x *CommonResult) GetSuccess() bool { @@ -1511,7 +1574,7 @@ type SimpleList struct { func (x *SimpleList) Reset() { *x = SimpleList{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_server_server_proto_msgTypes[24] + mi := &file_pkg_server_server_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1524,7 +1587,7 @@ func (x *SimpleList) String() string { func (*SimpleList) ProtoMessage() {} func (x *SimpleList) ProtoReflect() protoreflect.Message { - mi := &file_pkg_server_server_proto_msgTypes[24] + mi := &file_pkg_server_server_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1537,7 +1600,7 @@ func (x *SimpleList) ProtoReflect() protoreflect.Message { // Deprecated: Use SimpleList.ProtoReflect.Descriptor instead. func (*SimpleList) Descriptor() ([]byte, []int) { - return file_pkg_server_server_proto_rawDescGZIP(), []int{24} + return file_pkg_server_server_proto_rawDescGZIP(), []int{25} } func (x *SimpleList) GetData() []*Pair { @@ -1558,7 +1621,7 @@ type SimpleName struct { func (x *SimpleName) Reset() { *x = SimpleName{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_server_server_proto_msgTypes[25] + mi := &file_pkg_server_server_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1571,7 +1634,7 @@ func (x *SimpleName) String() string { func (*SimpleName) ProtoMessage() {} func (x *SimpleName) ProtoReflect() protoreflect.Message { - mi := &file_pkg_server_server_proto_msgTypes[25] + mi := &file_pkg_server_server_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1584,7 +1647,7 @@ func (x *SimpleName) ProtoReflect() protoreflect.Message { // Deprecated: Use SimpleName.ProtoReflect.Descriptor instead. func (*SimpleName) Descriptor() ([]byte, []int) { - return file_pkg_server_server_proto_rawDescGZIP(), []int{25} + return file_pkg_server_server_proto_rawDescGZIP(), []int{26} } func (x *SimpleName) GetName() string { @@ -1607,7 +1670,7 @@ type CodeGenerateRequest struct { func (x *CodeGenerateRequest) Reset() { *x = CodeGenerateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_server_server_proto_msgTypes[26] + mi := &file_pkg_server_server_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1620,7 +1683,7 @@ func (x *CodeGenerateRequest) String() string { func (*CodeGenerateRequest) ProtoMessage() {} func (x *CodeGenerateRequest) ProtoReflect() protoreflect.Message { - mi := &file_pkg_server_server_proto_msgTypes[26] + mi := &file_pkg_server_server_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1633,7 +1696,7 @@ func (x *CodeGenerateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CodeGenerateRequest.ProtoReflect.Descriptor instead. func (*CodeGenerateRequest) Descriptor() ([]byte, []int) { - return file_pkg_server_server_proto_rawDescGZIP(), []int{26} + return file_pkg_server_server_proto_rawDescGZIP(), []int{27} } func (x *CodeGenerateRequest) GetTestSuite() string { @@ -1668,7 +1731,7 @@ type Secrets struct { func (x *Secrets) Reset() { *x = Secrets{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_server_server_proto_msgTypes[27] + mi := &file_pkg_server_server_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1681,7 +1744,7 @@ func (x *Secrets) String() string { func (*Secrets) ProtoMessage() {} func (x *Secrets) ProtoReflect() protoreflect.Message { - mi := &file_pkg_server_server_proto_msgTypes[27] + mi := &file_pkg_server_server_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1694,7 +1757,7 @@ func (x *Secrets) ProtoReflect() protoreflect.Message { // Deprecated: Use Secrets.ProtoReflect.Descriptor instead. func (*Secrets) Descriptor() ([]byte, []int) { - return file_pkg_server_server_proto_rawDescGZIP(), []int{27} + return file_pkg_server_server_proto_rawDescGZIP(), []int{28} } func (x *Secrets) GetData() []*Secret { @@ -1717,7 +1780,7 @@ type Secret struct { func (x *Secret) Reset() { *x = Secret{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_server_server_proto_msgTypes[28] + mi := &file_pkg_server_server_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1730,7 +1793,7 @@ func (x *Secret) String() string { func (*Secret) ProtoMessage() {} func (x *Secret) ProtoReflect() protoreflect.Message { - mi := &file_pkg_server_server_proto_msgTypes[28] + mi := &file_pkg_server_server_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1743,7 +1806,7 @@ func (x *Secret) ProtoReflect() protoreflect.Message { // Deprecated: Use Secret.ProtoReflect.Descriptor instead. func (*Secret) Descriptor() ([]byte, []int) { - return file_pkg_server_server_proto_rawDescGZIP(), []int{28} + return file_pkg_server_server_proto_rawDescGZIP(), []int{29} } func (x *Secret) GetName() string { @@ -1776,7 +1839,7 @@ type Empty struct { func (x *Empty) Reset() { *x = Empty{} if protoimpl.UnsafeEnabled { - mi := &file_pkg_server_server_proto_msgTypes[29] + mi := &file_pkg_server_server_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1789,7 +1852,7 @@ func (x *Empty) String() string { func (*Empty) ProtoMessage() {} func (x *Empty) ProtoReflect() protoreflect.Message { - mi := &file_pkg_server_server_proto_msgTypes[29] + mi := &file_pkg_server_server_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1802,7 +1865,7 @@ func (x *Empty) ProtoReflect() protoreflect.Message { // Deprecated: Use Empty.ProtoReflect.Descriptor instead. func (*Empty) Descriptor() ([]byte, []int) { - return file_pkg_server_server_proto_rawDescGZIP(), []int{29} + return file_pkg_server_server_proto_rawDescGZIP(), []int{30} } var File_pkg_server_server_proto protoreflect.FileDescriptor @@ -1824,282 +1887,291 @@ var file_pkg_server_server_proto_rawDesc = []byte{ 0x74, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x75, 0x69, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x75, 0x69, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x73, 0x74, 0x63, 0x61, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x73, 0x74, - 0x63, 0x61, 0x73, 0x65, 0x22, 0x7a, 0x0a, 0x09, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x70, 0x69, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x61, 0x70, 0x69, 0x12, 0x22, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x61, 0x6d, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, - 0x50, 0x61, 0x69, 0x72, 0x52, 0x05, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x23, 0x0a, 0x04, 0x73, - 0x70, 0x65, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x41, 0x50, 0x49, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, - 0x22, 0x2f, 0x0a, 0x07, 0x41, 0x50, 0x49, 0x53, 0x70, 0x65, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x6b, - 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, - 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, - 0x6c, 0x22, 0x39, 0x0a, 0x11, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x49, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x70, - 0x69, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x70, 0x69, 0x22, 0xc9, 0x01, 0x0a, - 0x08, 0x54, 0x65, 0x73, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, - 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, - 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x65, - 0x76, 0x65, 0x6c, 0x12, 0x2b, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x2e, 0x45, 0x6e, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x65, 0x6e, 0x76, - 0x1a, 0x36, 0x0a, 0x08, 0x45, 0x6e, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 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, 0x22, 0x7c, 0x0a, 0x0a, 0x54, 0x65, 0x73, 0x74, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x3e, 0x0a, 0x0e, 0x74, 0x65, 0x73, 0x74, 0x43, 0x61, - 0x73, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, - 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0e, 0x74, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x3c, 0x0a, 0x0a, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x22, 0x55, 0x0a, 0x05, 0x53, 0x75, 0x69, 0x74, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x70, 0x69, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x61, 0x70, 0x69, 0x12, 0x26, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, - 0x43, 0x61, 0x73, 0x65, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x57, 0x0a, 0x11, 0x54, - 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x75, 0x69, 0x74, 0x65, - 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x75, 0x69, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x75, 0x69, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x24, - 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x52, 0x04, - 0x64, 0x61, 0x74, 0x61, 0x22, 0x31, 0x0a, 0x09, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, - 0x73, 0x12, 0x24, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x10, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, - 0x65, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x95, 0x01, 0x0a, 0x08, 0x54, 0x65, 0x73, 0x74, - 0x43, 0x61, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x75, 0x69, 0x74, - 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x75, 0x69, - 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x2c, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0xb3, 0x01, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x61, - 0x70, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x70, 0x69, 0x12, 0x16, 0x0a, - 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, - 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x24, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x50, - 0x61, 0x69, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x05, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x2e, 0x50, 0x61, 0x69, 0x72, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, - 0x20, 0x0a, 0x04, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x50, 0x61, 0x69, 0x72, 0x52, 0x04, 0x66, 0x6f, 0x72, - 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x62, 0x6f, 0x64, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, - 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x24, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, - 0x50, 0x61, 0x69, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x10, - 0x62, 0x6f, 0x64, 0x79, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x45, 0x78, 0x70, 0x65, 0x63, 0x74, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, - 0x50, 0x61, 0x69, 0x72, 0x52, 0x10, 0x62, 0x6f, 0x64, 0x79, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, - 0x45, 0x78, 0x70, 0x65, 0x63, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, - 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x16, - 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0xa8, 0x01, 0x0a, 0x0e, 0x54, 0x65, 0x73, 0x74, 0x43, - 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, - 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x24, 0x0a, - 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x50, 0x61, 0x69, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x22, 0x2e, 0x0a, 0x04, 0x50, 0x61, 0x69, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x63, 0x61, 0x73, 0x65, 0x22, 0x4b, 0x0a, 0x0f, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, + 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, + 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x12, 0x0a, + 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, + 0x61, 0x22, 0x7a, 0x0a, 0x09, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x70, 0x69, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x61, 0x70, 0x69, 0x12, 0x22, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x50, 0x61, 0x69, + 0x72, 0x52, 0x05, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x23, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x41, 0x50, 0x49, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x2f, 0x0a, + 0x07, 0x41, 0x50, 0x49, 0x53, 0x70, 0x65, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x10, 0x0a, 0x03, + 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, 0x39, + 0x0a, 0x11, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x70, 0x69, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x70, 0x69, 0x22, 0xc9, 0x01, 0x0a, 0x08, 0x54, 0x65, + 0x73, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, + 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x1a, + 0x0a, 0x08, 0x63, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x63, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x65, + 0x76, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, + 0x12, 0x2b, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x2e, + 0x45, 0x6e, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x1a, 0x36, 0x0a, + 0x08, 0x45, 0x6e, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 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, 0x22, 0x29, 0x0a, 0x05, 0x50, 0x61, 0x69, 0x72, 0x73, 0x12, 0x20, 0x0a, 0x04, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2e, 0x50, 0x61, 0x69, 0x72, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x21, 0x0a, 0x0b, - 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, - 0x2b, 0x0a, 0x06, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x21, 0x0a, 0x04, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xf2, 0x01, 0x0a, - 0x05, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, - 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1a, - 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, - 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, - 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x2c, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x2e, 0x50, 0x61, 0x69, 0x72, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x72, - 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, - 0x65, 0x61, 0x64, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, - 0x79, 0x22, 0x33, 0x0a, 0x0a, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x73, 0x12, - 0x25, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x4b, 0x69, 0x6e, 0x64, - 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x31, 0x0a, 0x09, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x4b, - 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, 0x42, 0x0a, 0x0c, 0x43, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x2e, 0x0a, - 0x0a, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x04, 0x64, - 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x50, 0x61, 0x69, 0x72, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x20, 0x0a, - 0x0a, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, - 0x6d, 0x0a, 0x13, 0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, - 0x69, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x54, 0x65, 0x73, 0x74, 0x53, - 0x75, 0x69, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, - 0x12, 0x1c, 0x0a, 0x09, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0x2d, - 0x0a, 0x07, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x22, 0x0a, 0x04, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x54, 0x0a, - 0x06, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x32, 0xc2, 0x0e, 0x0a, - 0x06, 0x52, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x12, 0x2d, 0x0a, 0x03, 0x52, 0x75, 0x6e, 0x12, 0x10, - 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x1a, 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x12, 0x2c, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x75, 0x69, - 0x74, 0x65, 0x73, 0x12, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x0e, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x75, 0x69, 0x74, - 0x65, 0x73, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, - 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x12, 0x19, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x65, 0x6c, 0x6c, - 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x7c, 0x0a, 0x0a, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x12, 0x3e, 0x0a, 0x0e, 0x74, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x52, 0x0e, 0x74, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x22, 0x3c, 0x0a, 0x0a, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x22, 0x55, 0x0a, 0x05, 0x53, 0x75, 0x69, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, + 0x0a, 0x03, 0x61, 0x70, 0x69, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x70, 0x69, + 0x12, 0x26, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x10, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, + 0x65, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x57, 0x0a, 0x11, 0x54, 0x65, 0x73, 0x74, + 0x43, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x75, 0x69, 0x74, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x73, 0x75, 0x69, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x73, 0x75, 0x69, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x04, 0x64, + 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x52, 0x04, 0x64, 0x61, 0x74, + 0x61, 0x22, 0x31, 0x0a, 0x09, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x73, 0x12, 0x24, + 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x52, 0x04, + 0x64, 0x61, 0x74, 0x61, 0x22, 0x95, 0x01, 0x0a, 0x08, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x75, 0x69, 0x74, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x75, 0x69, 0x74, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, + 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x10, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb3, 0x01, 0x0a, + 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x70, 0x69, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x70, 0x69, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, + 0x6f, 0x64, 0x12, 0x24, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x50, 0x61, 0x69, 0x72, + 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x2e, 0x50, 0x61, 0x69, 0x72, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x04, + 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x2e, 0x50, 0x61, 0x69, 0x72, 0x52, 0x04, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x12, + 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x62, 0x6f, + 0x64, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x1e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x62, + 0x6f, 0x64, 0x79, 0x12, 0x24, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x50, 0x61, 0x69, + 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x10, 0x62, 0x6f, 0x64, + 0x79, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x45, 0x78, 0x70, 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x50, 0x61, 0x69, + 0x72, 0x52, 0x10, 0x62, 0x6f, 0x64, 0x79, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x45, 0x78, 0x70, + 0x65, 0x63, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x05, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x06, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0xa8, 0x01, 0x0a, 0x0e, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x43, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x24, 0x0a, 0x06, 0x68, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x2e, 0x50, 0x61, 0x69, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x2e, + 0x0a, 0x04, 0x50, 0x61, 0x69, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 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, 0x22, 0x29, + 0x0a, 0x05, 0x50, 0x61, 0x69, 0x72, 0x73, 0x12, 0x20, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x50, + 0x61, 0x69, 0x72, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x21, 0x0a, 0x0b, 0x53, 0x69, 0x6d, + 0x70, 0x6c, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x2b, 0x0a, 0x06, + 0x53, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x21, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, + 0x6f, 0x72, 0x65, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xf2, 0x01, 0x0a, 0x05, 0x53, 0x74, + 0x6f, 0x72, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x75, + 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, + 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x12, 0x2c, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x2e, 0x50, 0x61, 0x69, 0x72, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x12, 0x25, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x4b, 0x69, + 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, + 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x22, 0x33, + 0x0a, 0x0a, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x73, 0x12, 0x25, 0x0a, 0x04, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x64, + 0x61, 0x74, 0x61, 0x22, 0x31, 0x0a, 0x09, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x4b, 0x69, 0x6e, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, 0x42, 0x0a, 0x0c, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x2e, 0x0a, 0x0a, 0x53, 0x69, + 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x50, 0x61, 0x69, 0x72, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x20, 0x0a, 0x0a, 0x53, 0x69, + 0x6d, 0x70, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x6d, 0x0a, 0x13, + 0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0x2d, 0x0a, 0x07, 0x53, + 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x22, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x54, 0x0a, 0x06, 0x53, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x20, + 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x32, 0x86, 0x0f, 0x0a, 0x06, 0x52, 0x75, + 0x6e, 0x6e, 0x65, 0x72, 0x12, 0x2d, 0x0a, 0x03, 0x52, 0x75, 0x6e, 0x12, 0x10, 0x2e, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x12, 0x2e, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x22, 0x00, 0x12, 0x2c, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, + 0x12, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x0e, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x22, + 0x00, 0x12, 0x42, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x73, 0x74, 0x53, + 0x75, 0x69, 0x74, 0x65, 0x12, 0x19, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, + 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x1a, + 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x54, + 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x12, 0x17, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x1a, 0x14, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x0c, 0x47, 0x65, 0x74, + 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x12, 0x19, 0x2e, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, + 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x0f, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x12, 0x11, 0x2e, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x1a, + 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x12, 0x19, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, - 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x0f, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x12, 0x11, 0x2e, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x1a, 0x12, - 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, - 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x12, 0x19, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x65, 0x6c, 0x6c, - 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, - 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x12, 0x19, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x74, 0x79, 0x1a, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x75, 0x69, - 0x74, 0x65, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, 0x75, 0x67, 0x67, 0x65, - 0x73, 0x74, 0x65, 0x64, 0x41, 0x50, 0x49, 0x73, 0x12, 0x19, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, - 0x74, 0x43, 0x61, 0x73, 0x65, 0x73, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x0b, 0x52, 0x75, 0x6e, 0x54, - 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, - 0x79, 0x1a, 0x16, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x43, - 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x0b, 0x47, - 0x65, 0x74, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x1a, 0x10, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, - 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x12, 0x19, 0x2e, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, - 0x53, 0x75, 0x69, 0x74, 0x65, 0x1a, 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, - 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x0e, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x12, 0x19, 0x2e, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x57, - 0x69, 0x74, 0x68, 0x53, 0x75, 0x69, 0x74, 0x65, 0x1a, 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x40, - 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, - 0x12, 0x18, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, - 0x73, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x38, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x69, - 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x00, 0x12, 0x43, 0x0a, 0x0c, 0x47, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x2e, 0x73, 0x65, 0x72, + 0x69, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x65, 0x6c, + 0x6c, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x0c, 0x4c, 0x69, 0x73, + 0x74, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x12, 0x19, 0x2e, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x1a, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x75, + 0x69, 0x74, 0x65, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, 0x75, 0x67, 0x67, + 0x65, 0x73, 0x74, 0x65, 0x64, 0x41, 0x50, 0x49, 0x73, 0x12, 0x19, 0x2e, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, + 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x73, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x0b, 0x52, 0x75, 0x6e, + 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, + 0x43, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x0b, + 0x47, 0x65, 0x74, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x1a, 0x10, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, + 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x0e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x12, 0x19, 0x2e, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, + 0x68, 0x53, 0x75, 0x69, 0x74, 0x65, 0x1a, 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x0e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x12, 0x19, + 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, + 0x57, 0x69, 0x74, 0x68, 0x53, 0x75, 0x69, 0x74, 0x65, 0x1a, 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x40, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, + 0x65, 0x12, 0x18, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x43, + 0x61, 0x73, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x38, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, + 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x00, 0x12, 0x43, 0x0a, 0x0c, 0x47, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x2e, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, + 0x12, 0x34, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x65, + 0x72, 0x12, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, + 0x4c, 0x69, 0x73, 0x74, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x10, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, + 0x74, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x12, 0x1b, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x12, - 0x34, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x72, - 0x12, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x4c, - 0x69, 0x73, 0x74, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x10, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, - 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x12, 0x1b, 0x2e, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, - 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x12, 0x30, - 0x0a, 0x0e, 0x50, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x72, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, - 0x12, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x50, 0x61, 0x69, 0x72, 0x73, 0x22, 0x00, - 0x12, 0x36, 0x0a, 0x0e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x12, 0x13, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x69, 0x6d, 0x70, - 0x6c, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x50, 0x61, 0x69, 0x72, 0x73, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x14, 0x46, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x12, 0x13, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x50, - 0x61, 0x69, 0x72, 0x73, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x31, 0x0a, 0x0a, 0x47, 0x65, - 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x30, 0x0a, 0x0e, 0x50, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x72, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x73, 0x12, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x50, 0x61, 0x69, 0x72, 0x73, 0x22, + 0x00, 0x12, 0x36, 0x0a, 0x0e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x12, 0x13, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x69, 0x6d, + 0x70, 0x6c, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x50, 0x61, 0x69, 0x72, 0x73, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x14, 0x46, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x12, 0x13, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x69, 0x6d, 0x70, 0x6c, + 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x50, 0x61, 0x69, 0x72, 0x73, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x31, 0x0a, 0x0a, 0x47, + 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2d, + 0x0a, 0x06, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2d, 0x0a, - 0x06, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, - 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x34, 0x0a, 0x0d, - 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x73, 0x12, 0x0d, 0x2e, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x73, - 0x22, 0x00, 0x12, 0x2c, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x12, - 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0e, - 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x22, 0x00, - 0x12, 0x2d, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x12, + 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x34, 0x0a, + 0x0d, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x73, 0x12, 0x0d, + 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x4b, 0x69, 0x6e, 0x64, + 0x73, 0x22, 0x00, 0x12, 0x2c, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x73, + 0x12, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x0e, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x22, + 0x00, 0x12, 0x2d, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, + 0x12, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x1a, + 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x22, 0x00, + 0x12, 0x2d, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x1a, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x22, 0x00, 0x12, - 0x2d, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x0d, + 0x2d, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x1a, 0x0d, 0x2e, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x22, 0x00, 0x12, 0x2d, - 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x0d, 0x2e, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x1a, 0x0d, 0x2e, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x22, 0x00, 0x12, 0x3a, 0x0a, - 0x0b, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x13, 0x2e, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x1a, 0x14, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x12, 0x2e, 0x0a, 0x0a, 0x47, 0x65, 0x74, - 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, - 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x22, 0x00, 0x12, 0x36, 0x0a, 0x0c, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x0e, 0x2e, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x1a, 0x14, 0x2e, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, - 0x00, 0x12, 0x36, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, - 0x74, 0x12, 0x0e, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, - 0x74, 0x1a, 0x14, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x12, 0x36, 0x0a, 0x0c, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x0e, 0x2e, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x1a, 0x14, 0x2e, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, - 0x00, 0x42, 0x2e, 0x5a, 0x2c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x73, 0x75, 0x72, 0x65, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2d, 0x74, - 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x22, 0x00, 0x12, 0x3a, + 0x0a, 0x0b, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x13, 0x2e, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x1a, 0x14, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x12, 0x2e, 0x0a, 0x0a, 0x47, 0x65, + 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x0d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x22, 0x00, 0x12, 0x36, 0x0a, 0x0c, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x0e, 0x2e, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x1a, 0x14, 0x2e, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x22, 0x00, 0x12, 0x36, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x65, 0x63, 0x72, + 0x65, 0x74, 0x12, 0x0e, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x63, 0x72, + 0x65, 0x74, 0x1a, 0x14, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x00, 0x12, 0x36, 0x0a, 0x0c, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x0e, 0x2e, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x1a, 0x14, 0x2e, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x22, 0x00, 0x42, 0x2e, 0x5a, 0x2c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x73, 0x75, 0x72, 0x65, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2d, + 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2114,132 +2186,135 @@ func file_pkg_server_server_proto_rawDescGZIP() []byte { return file_pkg_server_server_proto_rawDescData } -var file_pkg_server_server_proto_msgTypes = make([]protoimpl.MessageInfo, 32) +var file_pkg_server_server_proto_msgTypes = make([]protoimpl.MessageInfo, 33) var file_pkg_server_server_proto_goTypes = []interface{}{ (*Suites)(nil), // 0: server.Suites (*Items)(nil), // 1: server.Items (*TestCaseIdentity)(nil), // 2: server.TestCaseIdentity - (*TestSuite)(nil), // 3: server.TestSuite - (*APISpec)(nil), // 4: server.APISpec - (*TestSuiteIdentity)(nil), // 5: server.TestSuiteIdentity - (*TestTask)(nil), // 6: server.TestTask - (*TestResult)(nil), // 7: server.TestResult - (*HelloReply)(nil), // 8: server.HelloReply - (*Suite)(nil), // 9: server.Suite - (*TestCaseWithSuite)(nil), // 10: server.TestCaseWithSuite - (*TestCases)(nil), // 11: server.TestCases - (*TestCase)(nil), // 12: server.TestCase - (*Request)(nil), // 13: server.Request - (*Response)(nil), // 14: server.Response - (*TestCaseResult)(nil), // 15: server.TestCaseResult - (*Pair)(nil), // 16: server.Pair - (*Pairs)(nil), // 17: server.Pairs - (*SimpleQuery)(nil), // 18: server.SimpleQuery - (*Stores)(nil), // 19: server.Stores - (*Store)(nil), // 20: server.Store - (*StoreKinds)(nil), // 21: server.StoreKinds - (*StoreKind)(nil), // 22: server.StoreKind - (*CommonResult)(nil), // 23: server.CommonResult - (*SimpleList)(nil), // 24: server.SimpleList - (*SimpleName)(nil), // 25: server.SimpleName - (*CodeGenerateRequest)(nil), // 26: server.CodeGenerateRequest - (*Secrets)(nil), // 27: server.Secrets - (*Secret)(nil), // 28: server.Secret - (*Empty)(nil), // 29: server.Empty - nil, // 30: server.Suites.DataEntry - nil, // 31: server.TestTask.EnvEntry + (*TestSuiteSource)(nil), // 3: server.TestSuiteSource + (*TestSuite)(nil), // 4: server.TestSuite + (*APISpec)(nil), // 5: server.APISpec + (*TestSuiteIdentity)(nil), // 6: server.TestSuiteIdentity + (*TestTask)(nil), // 7: server.TestTask + (*TestResult)(nil), // 8: server.TestResult + (*HelloReply)(nil), // 9: server.HelloReply + (*Suite)(nil), // 10: server.Suite + (*TestCaseWithSuite)(nil), // 11: server.TestCaseWithSuite + (*TestCases)(nil), // 12: server.TestCases + (*TestCase)(nil), // 13: server.TestCase + (*Request)(nil), // 14: server.Request + (*Response)(nil), // 15: server.Response + (*TestCaseResult)(nil), // 16: server.TestCaseResult + (*Pair)(nil), // 17: server.Pair + (*Pairs)(nil), // 18: server.Pairs + (*SimpleQuery)(nil), // 19: server.SimpleQuery + (*Stores)(nil), // 20: server.Stores + (*Store)(nil), // 21: server.Store + (*StoreKinds)(nil), // 22: server.StoreKinds + (*StoreKind)(nil), // 23: server.StoreKind + (*CommonResult)(nil), // 24: server.CommonResult + (*SimpleList)(nil), // 25: server.SimpleList + (*SimpleName)(nil), // 26: server.SimpleName + (*CodeGenerateRequest)(nil), // 27: server.CodeGenerateRequest + (*Secrets)(nil), // 28: server.Secrets + (*Secret)(nil), // 29: server.Secret + (*Empty)(nil), // 30: server.Empty + nil, // 31: server.Suites.DataEntry + nil, // 32: server.TestTask.EnvEntry } var file_pkg_server_server_proto_depIdxs = []int32{ - 30, // 0: server.Suites.data:type_name -> server.Suites.DataEntry - 16, // 1: server.TestSuite.param:type_name -> server.Pair - 4, // 2: server.TestSuite.spec:type_name -> server.APISpec - 31, // 3: server.TestTask.env:type_name -> server.TestTask.EnvEntry - 15, // 4: server.TestResult.testCaseResult:type_name -> server.TestCaseResult - 12, // 5: server.Suite.items:type_name -> server.TestCase - 12, // 6: server.TestCaseWithSuite.data:type_name -> server.TestCase - 12, // 7: server.TestCases.data:type_name -> server.TestCase - 13, // 8: server.TestCase.request:type_name -> server.Request - 14, // 9: server.TestCase.response:type_name -> server.Response - 16, // 10: server.Request.header:type_name -> server.Pair - 16, // 11: server.Request.query:type_name -> server.Pair - 16, // 12: server.Request.form:type_name -> server.Pair - 16, // 13: server.Response.header:type_name -> server.Pair - 16, // 14: server.Response.bodyFieldsExpect:type_name -> server.Pair - 16, // 15: server.TestCaseResult.header:type_name -> server.Pair - 16, // 16: server.Pairs.data:type_name -> server.Pair - 20, // 17: server.Stores.data:type_name -> server.Store - 16, // 18: server.Store.properties:type_name -> server.Pair - 22, // 19: server.Store.kind:type_name -> server.StoreKind - 22, // 20: server.StoreKinds.data:type_name -> server.StoreKind - 16, // 21: server.SimpleList.data:type_name -> server.Pair - 28, // 22: server.Secrets.data:type_name -> server.Secret + 31, // 0: server.Suites.data:type_name -> server.Suites.DataEntry + 17, // 1: server.TestSuite.param:type_name -> server.Pair + 5, // 2: server.TestSuite.spec:type_name -> server.APISpec + 32, // 3: server.TestTask.env:type_name -> server.TestTask.EnvEntry + 16, // 4: server.TestResult.testCaseResult:type_name -> server.TestCaseResult + 13, // 5: server.Suite.items:type_name -> server.TestCase + 13, // 6: server.TestCaseWithSuite.data:type_name -> server.TestCase + 13, // 7: server.TestCases.data:type_name -> server.TestCase + 14, // 8: server.TestCase.request:type_name -> server.Request + 15, // 9: server.TestCase.response:type_name -> server.Response + 17, // 10: server.Request.header:type_name -> server.Pair + 17, // 11: server.Request.query:type_name -> server.Pair + 17, // 12: server.Request.form:type_name -> server.Pair + 17, // 13: server.Response.header:type_name -> server.Pair + 17, // 14: server.Response.bodyFieldsExpect:type_name -> server.Pair + 17, // 15: server.TestCaseResult.header:type_name -> server.Pair + 17, // 16: server.Pairs.data:type_name -> server.Pair + 21, // 17: server.Stores.data:type_name -> server.Store + 17, // 18: server.Store.properties:type_name -> server.Pair + 23, // 19: server.Store.kind:type_name -> server.StoreKind + 23, // 20: server.StoreKinds.data:type_name -> server.StoreKind + 17, // 21: server.SimpleList.data:type_name -> server.Pair + 29, // 22: server.Secrets.data:type_name -> server.Secret 1, // 23: server.Suites.DataEntry.value:type_name -> server.Items - 6, // 24: server.Runner.Run:input_type -> server.TestTask - 29, // 25: server.Runner.GetSuites:input_type -> server.Empty - 5, // 26: server.Runner.CreateTestSuite:input_type -> server.TestSuiteIdentity - 5, // 27: server.Runner.GetTestSuite:input_type -> server.TestSuiteIdentity - 3, // 28: server.Runner.UpdateTestSuite:input_type -> server.TestSuite - 5, // 29: server.Runner.DeleteTestSuite:input_type -> server.TestSuiteIdentity - 5, // 30: server.Runner.ListTestCase:input_type -> server.TestSuiteIdentity - 5, // 31: server.Runner.GetSuggestedAPIs:input_type -> server.TestSuiteIdentity - 2, // 32: server.Runner.RunTestCase:input_type -> server.TestCaseIdentity - 2, // 33: server.Runner.GetTestCase:input_type -> server.TestCaseIdentity - 10, // 34: server.Runner.CreateTestCase:input_type -> server.TestCaseWithSuite - 10, // 35: server.Runner.UpdateTestCase:input_type -> server.TestCaseWithSuite - 2, // 36: server.Runner.DeleteTestCase:input_type -> server.TestCaseIdentity - 29, // 37: server.Runner.ListCodeGenerator:input_type -> server.Empty - 26, // 38: server.Runner.GenerateCode:input_type -> server.CodeGenerateRequest - 29, // 39: server.Runner.ListConverter:input_type -> server.Empty - 26, // 40: server.Runner.ConvertTestSuite:input_type -> server.CodeGenerateRequest - 29, // 41: server.Runner.PopularHeaders:input_type -> server.Empty - 18, // 42: server.Runner.FunctionsQuery:input_type -> server.SimpleQuery - 18, // 43: server.Runner.FunctionsQueryStream:input_type -> server.SimpleQuery - 29, // 44: server.Runner.GetVersion:input_type -> server.Empty - 29, // 45: server.Runner.Sample:input_type -> server.Empty - 29, // 46: server.Runner.GetStoreKinds:input_type -> server.Empty - 29, // 47: server.Runner.GetStores:input_type -> server.Empty - 20, // 48: server.Runner.CreateStore:input_type -> server.Store - 20, // 49: server.Runner.UpdateStore:input_type -> server.Store - 20, // 50: server.Runner.DeleteStore:input_type -> server.Store - 18, // 51: server.Runner.VerifyStore:input_type -> server.SimpleQuery - 29, // 52: server.Runner.GetSecrets:input_type -> server.Empty - 28, // 53: server.Runner.CreateSecret:input_type -> server.Secret - 28, // 54: server.Runner.DeleteSecret:input_type -> server.Secret - 28, // 55: server.Runner.UpdateSecret:input_type -> server.Secret - 7, // 56: server.Runner.Run:output_type -> server.TestResult - 0, // 57: server.Runner.GetSuites:output_type -> server.Suites - 8, // 58: server.Runner.CreateTestSuite:output_type -> server.HelloReply - 3, // 59: server.Runner.GetTestSuite:output_type -> server.TestSuite - 8, // 60: server.Runner.UpdateTestSuite:output_type -> server.HelloReply - 8, // 61: server.Runner.DeleteTestSuite:output_type -> server.HelloReply - 9, // 62: server.Runner.ListTestCase:output_type -> server.Suite - 11, // 63: server.Runner.GetSuggestedAPIs:output_type -> server.TestCases - 15, // 64: server.Runner.RunTestCase:output_type -> server.TestCaseResult - 12, // 65: server.Runner.GetTestCase:output_type -> server.TestCase - 8, // 66: server.Runner.CreateTestCase:output_type -> server.HelloReply - 8, // 67: server.Runner.UpdateTestCase:output_type -> server.HelloReply - 8, // 68: server.Runner.DeleteTestCase:output_type -> server.HelloReply - 24, // 69: server.Runner.ListCodeGenerator:output_type -> server.SimpleList - 23, // 70: server.Runner.GenerateCode:output_type -> server.CommonResult - 24, // 71: server.Runner.ListConverter:output_type -> server.SimpleList - 23, // 72: server.Runner.ConvertTestSuite:output_type -> server.CommonResult - 17, // 73: server.Runner.PopularHeaders:output_type -> server.Pairs - 17, // 74: server.Runner.FunctionsQuery:output_type -> server.Pairs - 17, // 75: server.Runner.FunctionsQueryStream:output_type -> server.Pairs - 8, // 76: server.Runner.GetVersion:output_type -> server.HelloReply - 8, // 77: server.Runner.Sample:output_type -> server.HelloReply - 21, // 78: server.Runner.GetStoreKinds:output_type -> server.StoreKinds - 19, // 79: server.Runner.GetStores:output_type -> server.Stores - 20, // 80: server.Runner.CreateStore:output_type -> server.Store - 20, // 81: server.Runner.UpdateStore:output_type -> server.Store - 20, // 82: server.Runner.DeleteStore:output_type -> server.Store - 23, // 83: server.Runner.VerifyStore:output_type -> server.CommonResult - 27, // 84: server.Runner.GetSecrets:output_type -> server.Secrets - 23, // 85: server.Runner.CreateSecret:output_type -> server.CommonResult - 23, // 86: server.Runner.DeleteSecret:output_type -> server.CommonResult - 23, // 87: server.Runner.UpdateSecret:output_type -> server.CommonResult - 56, // [56:88] is the sub-list for method output_type - 24, // [24:56] is the sub-list for method input_type + 7, // 24: server.Runner.Run:input_type -> server.TestTask + 30, // 25: server.Runner.GetSuites:input_type -> server.Empty + 6, // 26: server.Runner.CreateTestSuite:input_type -> server.TestSuiteIdentity + 3, // 27: server.Runner.ImportTestSuite:input_type -> server.TestSuiteSource + 6, // 28: server.Runner.GetTestSuite:input_type -> server.TestSuiteIdentity + 4, // 29: server.Runner.UpdateTestSuite:input_type -> server.TestSuite + 6, // 30: server.Runner.DeleteTestSuite:input_type -> server.TestSuiteIdentity + 6, // 31: server.Runner.ListTestCase:input_type -> server.TestSuiteIdentity + 6, // 32: server.Runner.GetSuggestedAPIs:input_type -> server.TestSuiteIdentity + 2, // 33: server.Runner.RunTestCase:input_type -> server.TestCaseIdentity + 2, // 34: server.Runner.GetTestCase:input_type -> server.TestCaseIdentity + 11, // 35: server.Runner.CreateTestCase:input_type -> server.TestCaseWithSuite + 11, // 36: server.Runner.UpdateTestCase:input_type -> server.TestCaseWithSuite + 2, // 37: server.Runner.DeleteTestCase:input_type -> server.TestCaseIdentity + 30, // 38: server.Runner.ListCodeGenerator:input_type -> server.Empty + 27, // 39: server.Runner.GenerateCode:input_type -> server.CodeGenerateRequest + 30, // 40: server.Runner.ListConverter:input_type -> server.Empty + 27, // 41: server.Runner.ConvertTestSuite:input_type -> server.CodeGenerateRequest + 30, // 42: server.Runner.PopularHeaders:input_type -> server.Empty + 19, // 43: server.Runner.FunctionsQuery:input_type -> server.SimpleQuery + 19, // 44: server.Runner.FunctionsQueryStream:input_type -> server.SimpleQuery + 30, // 45: server.Runner.GetVersion:input_type -> server.Empty + 30, // 46: server.Runner.Sample:input_type -> server.Empty + 30, // 47: server.Runner.GetStoreKinds:input_type -> server.Empty + 30, // 48: server.Runner.GetStores:input_type -> server.Empty + 21, // 49: server.Runner.CreateStore:input_type -> server.Store + 21, // 50: server.Runner.UpdateStore:input_type -> server.Store + 21, // 51: server.Runner.DeleteStore:input_type -> server.Store + 19, // 52: server.Runner.VerifyStore:input_type -> server.SimpleQuery + 30, // 53: server.Runner.GetSecrets:input_type -> server.Empty + 29, // 54: server.Runner.CreateSecret:input_type -> server.Secret + 29, // 55: server.Runner.DeleteSecret:input_type -> server.Secret + 29, // 56: server.Runner.UpdateSecret:input_type -> server.Secret + 8, // 57: server.Runner.Run:output_type -> server.TestResult + 0, // 58: server.Runner.GetSuites:output_type -> server.Suites + 9, // 59: server.Runner.CreateTestSuite:output_type -> server.HelloReply + 24, // 60: server.Runner.ImportTestSuite:output_type -> server.CommonResult + 4, // 61: server.Runner.GetTestSuite:output_type -> server.TestSuite + 9, // 62: server.Runner.UpdateTestSuite:output_type -> server.HelloReply + 9, // 63: server.Runner.DeleteTestSuite:output_type -> server.HelloReply + 10, // 64: server.Runner.ListTestCase:output_type -> server.Suite + 12, // 65: server.Runner.GetSuggestedAPIs:output_type -> server.TestCases + 16, // 66: server.Runner.RunTestCase:output_type -> server.TestCaseResult + 13, // 67: server.Runner.GetTestCase:output_type -> server.TestCase + 9, // 68: server.Runner.CreateTestCase:output_type -> server.HelloReply + 9, // 69: server.Runner.UpdateTestCase:output_type -> server.HelloReply + 9, // 70: server.Runner.DeleteTestCase:output_type -> server.HelloReply + 25, // 71: server.Runner.ListCodeGenerator:output_type -> server.SimpleList + 24, // 72: server.Runner.GenerateCode:output_type -> server.CommonResult + 25, // 73: server.Runner.ListConverter:output_type -> server.SimpleList + 24, // 74: server.Runner.ConvertTestSuite:output_type -> server.CommonResult + 18, // 75: server.Runner.PopularHeaders:output_type -> server.Pairs + 18, // 76: server.Runner.FunctionsQuery:output_type -> server.Pairs + 18, // 77: server.Runner.FunctionsQueryStream:output_type -> server.Pairs + 9, // 78: server.Runner.GetVersion:output_type -> server.HelloReply + 9, // 79: server.Runner.Sample:output_type -> server.HelloReply + 22, // 80: server.Runner.GetStoreKinds:output_type -> server.StoreKinds + 20, // 81: server.Runner.GetStores:output_type -> server.Stores + 21, // 82: server.Runner.CreateStore:output_type -> server.Store + 21, // 83: server.Runner.UpdateStore:output_type -> server.Store + 21, // 84: server.Runner.DeleteStore:output_type -> server.Store + 24, // 85: server.Runner.VerifyStore:output_type -> server.CommonResult + 28, // 86: server.Runner.GetSecrets:output_type -> server.Secrets + 24, // 87: server.Runner.CreateSecret:output_type -> server.CommonResult + 24, // 88: server.Runner.DeleteSecret:output_type -> server.CommonResult + 24, // 89: server.Runner.UpdateSecret:output_type -> server.CommonResult + 57, // [57:90] is the sub-list for method output_type + 24, // [24:57] is the sub-list for method input_type 24, // [24:24] is the sub-list for extension type_name 24, // [24:24] is the sub-list for extension extendee 0, // [0:24] is the sub-list for field type_name @@ -2288,7 +2363,7 @@ func file_pkg_server_server_proto_init() { } } file_pkg_server_server_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TestSuite); i { + switch v := v.(*TestSuiteSource); i { case 0: return &v.state case 1: @@ -2300,7 +2375,7 @@ func file_pkg_server_server_proto_init() { } } file_pkg_server_server_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*APISpec); i { + switch v := v.(*TestSuite); i { case 0: return &v.state case 1: @@ -2312,7 +2387,7 @@ func file_pkg_server_server_proto_init() { } } file_pkg_server_server_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TestSuiteIdentity); i { + switch v := v.(*APISpec); i { case 0: return &v.state case 1: @@ -2324,7 +2399,7 @@ func file_pkg_server_server_proto_init() { } } file_pkg_server_server_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TestTask); i { + switch v := v.(*TestSuiteIdentity); i { case 0: return &v.state case 1: @@ -2336,7 +2411,7 @@ func file_pkg_server_server_proto_init() { } } file_pkg_server_server_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TestResult); i { + switch v := v.(*TestTask); i { case 0: return &v.state case 1: @@ -2348,7 +2423,7 @@ func file_pkg_server_server_proto_init() { } } file_pkg_server_server_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HelloReply); i { + switch v := v.(*TestResult); i { case 0: return &v.state case 1: @@ -2360,7 +2435,7 @@ func file_pkg_server_server_proto_init() { } } file_pkg_server_server_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Suite); i { + switch v := v.(*HelloReply); i { case 0: return &v.state case 1: @@ -2372,7 +2447,7 @@ func file_pkg_server_server_proto_init() { } } file_pkg_server_server_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TestCaseWithSuite); i { + switch v := v.(*Suite); i { case 0: return &v.state case 1: @@ -2384,7 +2459,7 @@ func file_pkg_server_server_proto_init() { } } file_pkg_server_server_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TestCases); i { + switch v := v.(*TestCaseWithSuite); i { case 0: return &v.state case 1: @@ -2396,7 +2471,7 @@ func file_pkg_server_server_proto_init() { } } file_pkg_server_server_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TestCase); i { + switch v := v.(*TestCases); i { case 0: return &v.state case 1: @@ -2408,7 +2483,7 @@ func file_pkg_server_server_proto_init() { } } file_pkg_server_server_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Request); i { + switch v := v.(*TestCase); i { case 0: return &v.state case 1: @@ -2420,7 +2495,7 @@ func file_pkg_server_server_proto_init() { } } file_pkg_server_server_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Response); i { + switch v := v.(*Request); i { case 0: return &v.state case 1: @@ -2432,7 +2507,7 @@ func file_pkg_server_server_proto_init() { } } file_pkg_server_server_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TestCaseResult); i { + switch v := v.(*Response); i { case 0: return &v.state case 1: @@ -2444,7 +2519,7 @@ func file_pkg_server_server_proto_init() { } } file_pkg_server_server_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Pair); i { + switch v := v.(*TestCaseResult); i { case 0: return &v.state case 1: @@ -2456,7 +2531,7 @@ func file_pkg_server_server_proto_init() { } } file_pkg_server_server_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Pairs); i { + switch v := v.(*Pair); i { case 0: return &v.state case 1: @@ -2468,7 +2543,7 @@ func file_pkg_server_server_proto_init() { } } file_pkg_server_server_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SimpleQuery); i { + switch v := v.(*Pairs); i { case 0: return &v.state case 1: @@ -2480,7 +2555,7 @@ func file_pkg_server_server_proto_init() { } } file_pkg_server_server_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Stores); i { + switch v := v.(*SimpleQuery); i { case 0: return &v.state case 1: @@ -2492,7 +2567,7 @@ func file_pkg_server_server_proto_init() { } } file_pkg_server_server_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Store); i { + switch v := v.(*Stores); i { case 0: return &v.state case 1: @@ -2504,7 +2579,7 @@ func file_pkg_server_server_proto_init() { } } file_pkg_server_server_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StoreKinds); i { + switch v := v.(*Store); i { case 0: return &v.state case 1: @@ -2516,7 +2591,7 @@ func file_pkg_server_server_proto_init() { } } file_pkg_server_server_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StoreKind); i { + switch v := v.(*StoreKinds); i { case 0: return &v.state case 1: @@ -2528,7 +2603,7 @@ func file_pkg_server_server_proto_init() { } } file_pkg_server_server_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CommonResult); i { + switch v := v.(*StoreKind); i { case 0: return &v.state case 1: @@ -2540,7 +2615,7 @@ func file_pkg_server_server_proto_init() { } } file_pkg_server_server_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SimpleList); i { + switch v := v.(*CommonResult); i { case 0: return &v.state case 1: @@ -2552,7 +2627,7 @@ func file_pkg_server_server_proto_init() { } } file_pkg_server_server_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SimpleName); i { + switch v := v.(*SimpleList); i { case 0: return &v.state case 1: @@ -2564,7 +2639,7 @@ func file_pkg_server_server_proto_init() { } } file_pkg_server_server_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CodeGenerateRequest); i { + switch v := v.(*SimpleName); i { case 0: return &v.state case 1: @@ -2576,7 +2651,7 @@ func file_pkg_server_server_proto_init() { } } file_pkg_server_server_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Secrets); i { + switch v := v.(*CodeGenerateRequest); i { case 0: return &v.state case 1: @@ -2588,7 +2663,7 @@ func file_pkg_server_server_proto_init() { } } file_pkg_server_server_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Secret); i { + switch v := v.(*Secrets); i { case 0: return &v.state case 1: @@ -2600,6 +2675,18 @@ func file_pkg_server_server_proto_init() { } } file_pkg_server_server_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Secret); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_pkg_server_server_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Empty); i { case 0: return &v.state @@ -2618,7 +2705,7 @@ func file_pkg_server_server_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_pkg_server_server_proto_rawDesc, NumEnums: 0, - NumMessages: 32, + NumMessages: 33, NumExtensions: 0, NumServices: 1, }, diff --git a/pkg/server/server.pb.gw.go b/pkg/server/server.pb.gw.go index 2bc76d7..c33d602 100644 --- a/pkg/server/server.pb.gw.go +++ b/pkg/server/server.pb.gw.go @@ -133,6 +133,40 @@ func local_request_Runner_CreateTestSuite_0(ctx context.Context, marshaler runti } +func request_Runner_ImportTestSuite_0(ctx context.Context, marshaler runtime.Marshaler, client RunnerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq TestSuiteSource + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ImportTestSuite(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Runner_ImportTestSuite_0(ctx context.Context, marshaler runtime.Marshaler, server RunnerServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq TestSuiteSource + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ImportTestSuite(ctx, &protoReq) + return msg, metadata, err + +} + func request_Runner_GetTestSuite_0(ctx context.Context, marshaler runtime.Marshaler, client RunnerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq TestSuiteIdentity var metadata runtime.ServerMetadata @@ -1209,6 +1243,31 @@ func RegisterRunnerHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser }) + mux.Handle("POST", pattern_Runner_ImportTestSuite_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/server.Runner/ImportTestSuite", runtime.WithHTTPPathPattern("/server.Runner/ImportTestSuite")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Runner_ImportTestSuite_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_Runner_ImportTestSuite_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_Runner_GetTestSuite_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -2023,6 +2082,28 @@ func RegisterRunnerHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli }) + mux.Handle("POST", pattern_Runner_ImportTestSuite_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/server.Runner/ImportTestSuite", runtime.WithHTTPPathPattern("/server.Runner/ImportTestSuite")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Runner_ImportTestSuite_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_Runner_ImportTestSuite_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_Runner_GetTestSuite_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -2671,6 +2752,8 @@ var ( pattern_Runner_CreateTestSuite_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"server.Runner", "CreateTestSuite"}, "")) + pattern_Runner_ImportTestSuite_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"server.Runner", "ImportTestSuite"}, "")) + pattern_Runner_GetTestSuite_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"server.Runner", "GetTestSuite"}, "")) pattern_Runner_UpdateTestSuite_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"server.Runner", "UpdateTestSuite"}, "")) @@ -2737,6 +2820,8 @@ var ( forward_Runner_CreateTestSuite_0 = runtime.ForwardResponseMessage + forward_Runner_ImportTestSuite_0 = runtime.ForwardResponseMessage + forward_Runner_GetTestSuite_0 = runtime.ForwardResponseMessage forward_Runner_UpdateTestSuite_0 = runtime.ForwardResponseMessage diff --git a/pkg/server/server.proto b/pkg/server/server.proto index ac45e3c..d55f555 100644 --- a/pkg/server/server.proto +++ b/pkg/server/server.proto @@ -10,6 +10,7 @@ service Runner { rpc GetSuites(Empty) returns (Suites) {} rpc CreateTestSuite(TestSuiteIdentity) returns (HelloReply) {} + rpc ImportTestSuite(TestSuiteSource) returns (CommonResult) {} rpc GetTestSuite(TestSuiteIdentity) returns (TestSuite) {} rpc UpdateTestSuite(TestSuite) returns (HelloReply) {} rpc DeleteTestSuite(TestSuiteIdentity) returns (HelloReply) {} @@ -66,6 +67,12 @@ message TestCaseIdentity { string testcase = 2; } +message TestSuiteSource { + string kind = 1; + string url = 2; + string data = 3; +} + message TestSuite { string name = 1; string api = 2; diff --git a/pkg/server/server_grpc.pb.go b/pkg/server/server_grpc.pb.go index 23eeb29..5d898c1 100644 --- a/pkg/server/server_grpc.pb.go +++ b/pkg/server/server_grpc.pb.go @@ -26,6 +26,7 @@ type RunnerClient interface { Run(ctx context.Context, in *TestTask, opts ...grpc.CallOption) (*TestResult, error) GetSuites(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Suites, error) CreateTestSuite(ctx context.Context, in *TestSuiteIdentity, opts ...grpc.CallOption) (*HelloReply, error) + ImportTestSuite(ctx context.Context, in *TestSuiteSource, opts ...grpc.CallOption) (*CommonResult, error) GetTestSuite(ctx context.Context, in *TestSuiteIdentity, opts ...grpc.CallOption) (*TestSuite, error) UpdateTestSuite(ctx context.Context, in *TestSuite, opts ...grpc.CallOption) (*HelloReply, error) DeleteTestSuite(ctx context.Context, in *TestSuiteIdentity, opts ...grpc.CallOption) (*HelloReply, error) @@ -98,6 +99,15 @@ func (c *runnerClient) CreateTestSuite(ctx context.Context, in *TestSuiteIdentit return out, nil } +func (c *runnerClient) ImportTestSuite(ctx context.Context, in *TestSuiteSource, opts ...grpc.CallOption) (*CommonResult, error) { + out := new(CommonResult) + err := c.cc.Invoke(ctx, "/server.Runner/ImportTestSuite", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *runnerClient) GetTestSuite(ctx context.Context, in *TestSuiteIdentity, opts ...grpc.CallOption) (*TestSuite, error) { out := new(TestSuite) err := c.cc.Invoke(ctx, "/server.Runner/GetTestSuite", in, out, opts...) @@ -389,6 +399,7 @@ type RunnerServer interface { Run(context.Context, *TestTask) (*TestResult, error) GetSuites(context.Context, *Empty) (*Suites, error) CreateTestSuite(context.Context, *TestSuiteIdentity) (*HelloReply, error) + ImportTestSuite(context.Context, *TestSuiteSource) (*CommonResult, error) GetTestSuite(context.Context, *TestSuiteIdentity) (*TestSuite, error) UpdateTestSuite(context.Context, *TestSuite) (*HelloReply, error) DeleteTestSuite(context.Context, *TestSuiteIdentity) (*HelloReply, error) @@ -440,6 +451,9 @@ func (UnimplementedRunnerServer) GetSuites(context.Context, *Empty) (*Suites, er func (UnimplementedRunnerServer) CreateTestSuite(context.Context, *TestSuiteIdentity) (*HelloReply, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateTestSuite not implemented") } +func (UnimplementedRunnerServer) ImportTestSuite(context.Context, *TestSuiteSource) (*CommonResult, error) { + return nil, status.Errorf(codes.Unimplemented, "method ImportTestSuite not implemented") +} func (UnimplementedRunnerServer) GetTestSuite(context.Context, *TestSuiteIdentity) (*TestSuite, error) { return nil, status.Errorf(codes.Unimplemented, "method GetTestSuite not implemented") } @@ -594,6 +608,24 @@ func _Runner_CreateTestSuite_Handler(srv interface{}, ctx context.Context, dec f return interceptor(ctx, in, info, handler) } +func _Runner_ImportTestSuite_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(TestSuiteSource) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RunnerServer).ImportTestSuite(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/server.Runner/ImportTestSuite", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RunnerServer).ImportTestSuite(ctx, req.(*TestSuiteSource)) + } + return interceptor(ctx, in, info, handler) +} + func _Runner_GetTestSuite_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(TestSuiteIdentity) if err := dec(in); err != nil { @@ -1143,6 +1175,10 @@ var Runner_ServiceDesc = grpc.ServiceDesc{ MethodName: "CreateTestSuite", Handler: _Runner_CreateTestSuite_Handler, }, + { + MethodName: "ImportTestSuite", + Handler: _Runner_ImportTestSuite_Handler, + }, { MethodName: "GetTestSuite", Handler: _Runner_GetTestSuite_Handler, diff --git a/pkg/server/testdata/postman.json b/pkg/server/testdata/postman.json new file mode 100644 index 0000000..eede993 --- /dev/null +++ b/pkg/server/testdata/postman.json @@ -0,0 +1,35 @@ +{ + "info": { + "_postman_id": "0da1f6bf-fdbb-46a5-ac46-873564e2259c", + "name": "New Collection", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", + "_exporter_id": "6795120", + "_collection_link": "https://www.postman.com/ks-devops/workspace/kubesphere-devops/collection/6795120-0da1f6bf-fdbb-46a5-ac46-873564e2259c?action=share&creator=6795120&source=collection_link" + }, + "item": [ + { + "name": "New Request", + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "method": "GET", + "header": [ + { + "key": "key", + "value": "value", + "description": "description", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{}" + }, + "url": { + "raw": "http://localhost?key=value" + } + } + } + ] +} \ No newline at end of file