diff --git a/.golangci.yaml b/.golangci.yaml index 8727dcacf..4f77ec595 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -15,7 +15,7 @@ linters: # - depguard - dogsled - dupl - - dupword + # - dupword - durationcheck # - err113 # - errcheck diff --git a/src/cmd/cli/command/commands.go b/src/cmd/cli/command/commands.go index 3c2f039a4..84fd2662a 100644 --- a/src/cmd/cli/command/commands.go +++ b/src/cmd/cli/command/commands.go @@ -21,6 +21,7 @@ import ( "github.com/DefangLabs/defang/src/pkg/cli/client/byoc/gcp" "github.com/DefangLabs/defang/src/pkg/cli/compose" "github.com/DefangLabs/defang/src/pkg/clouds/aws" + "github.com/DefangLabs/defang/src/pkg/github" "github.com/DefangLabs/defang/src/pkg/logs" "github.com/DefangLabs/defang/src/pkg/mcp" "github.com/DefangLabs/defang/src/pkg/scope" @@ -149,7 +150,7 @@ func Execute(ctx context.Context) error { } if hasTty && !hideUpdate && pkg.RandomIndex(10) == 0 { - if latest, err := GetLatestVersion(ctx); err == nil && isNewer(GetCurrentVersion(), latest) { + if latest, err := github.GetLatestReleaseTag(ctx); err == nil && isNewer(GetCurrentVersion(), latest) { term.Debug("Latest Version:", latest, "Current Version:", GetCurrentVersion()) fmt.Println("A newer version of the CLI is available at https://github.com/DefangLabs/defang/releases/latest") if pkg.RandomIndex(10) == 0 && !pkg.GetenvBool("DEFANG_HIDE_HINTS") { @@ -730,7 +731,7 @@ var getVersionCmd = &cobra.Command{ fmt.Println(GetCurrentVersion()) term.Printc(term.BrightCyan, "Latest CLI: ") - ver, err := GetLatestVersion(cmd.Context()) + ver, err := github.GetLatestReleaseTag(cmd.Context()) fmt.Println(ver) term.Printc(term.BrightCyan, "Defang Fabric: ") @@ -808,7 +809,7 @@ var configSetCmd = &cobra.Command{ value = strings.TrimSuffix(string(bytes), "\n") } else if random { // Generate a random value for the config - value = CreateRandomConfigValue() + value = cli.CreateRandomConfigValue() term.Info("Generated random value: " + value) } else { // Prompt for sensitive value diff --git a/src/cmd/cli/command/compose.go b/src/cmd/cli/command/compose.go index e215fe45d..bdd7b45a1 100644 --- a/src/cmd/cli/command/compose.go +++ b/src/cmd/cli/command/compose.go @@ -26,6 +26,19 @@ import ( "github.com/spf13/cobra" ) +const DEFANG_PORTAL_HOST = "portal.defang.io" +const SERVICE_PORTAL_URL = "https://" + DEFANG_PORTAL_HOST + "/service" + +func printPlaygroundPortalServiceURLs(serviceInfos []*defangv1.ServiceInfo) { + // We can only show services deployed to the prod1 defang SaaS environment. + if providerID == cliClient.ProviderDefang && cluster == cli.DefaultCluster { + term.Info("Monitor your services' status in the defang portal") + for _, serviceInfo := range serviceInfos { + term.Println(" -", SERVICE_PORTAL_URL+"/"+serviceInfo.Service.Name) + } + } +} + func createProjectForDebug(loader *compose.Loader) (*compose.Project, error) { projOpts, err := loader.NewProjectOptions() if err != nil { @@ -193,7 +206,7 @@ func makeComposeUpCmd() *cobra.Command { } // Print the current service states of the deployment - err = printServiceStatesAndEndpoints(deploy.Services) + err = cli.PrintServiceStatesAndEndpoints(ctx, deploy.Services) if err != nil { return err } diff --git a/src/cmd/cli/command/compose_test.go b/src/cmd/cli/command/compose_test.go index 8568c3ec1..a36c78fe9 100644 --- a/src/cmd/cli/command/compose_test.go +++ b/src/cmd/cli/command/compose_test.go @@ -1,7 +1,14 @@ package command import ( + "bytes" + "os" "testing" + + "github.com/DefangLabs/defang/src/pkg/cli" + cliClient "github.com/DefangLabs/defang/src/pkg/cli/client" + "github.com/DefangLabs/defang/src/pkg/term" + defangv1 "github.com/DefangLabs/defang/src/protos/io/defang/v1" ) func TestInitializeTailCmd(t *testing.T) { @@ -14,3 +21,26 @@ func TestInitializeTailCmd(t *testing.T) { } }) } + +func TestPrintPlaygroundPortalServiceURLs(t *testing.T) { + defaultTerm := term.DefaultTerm + t.Cleanup(func() { + term.DefaultTerm = defaultTerm + }) + + var stdout, stderr bytes.Buffer + term.DefaultTerm = term.NewTerm(os.Stdin, &stdout, &stderr) + + providerID = cliClient.ProviderDefang + cluster = cli.DefaultCluster + printPlaygroundPortalServiceURLs([]*defangv1.ServiceInfo{ + { + Service: &defangv1.Service{Name: "service1"}, + }}) + const want = ` * Monitor your services' status in the defang portal + - https://portal.defang.io/service/service1 +` + if got := stdout.String(); got != want { + t.Errorf("got %q, want %q", got, want) + } +} diff --git a/src/cmd/cli/command/deploymentinfo.go b/src/cmd/cli/command/deploymentinfo.go deleted file mode 100644 index 66b3d1e8e..000000000 --- a/src/cmd/cli/command/deploymentinfo.go +++ /dev/null @@ -1,86 +0,0 @@ -package command - -import ( - "regexp" - "strings" - - "github.com/DefangLabs/defang/src/pkg/cli" - cliClient "github.com/DefangLabs/defang/src/pkg/cli/client" - "github.com/DefangLabs/defang/src/pkg/term" - defangv1 "github.com/DefangLabs/defang/src/protos/io/defang/v1" -) - -const DEFANG_PORTAL_HOST = "portal.defang.io" -const SERVICE_PORTAL_URL = "https://" + DEFANG_PORTAL_HOST + "/service" - -func printPlaygroundPortalServiceURLs(serviceInfos []*defangv1.ServiceInfo) { - // We can only show services deployed to the prod1 defang SaaS environment. - if providerID == cliClient.ProviderDefang && cluster == cli.DefaultCluster { - term.Info("Monitor your services' status in the defang portal") - for _, serviceInfo := range serviceInfos { - term.Println(" -", SERVICE_PORTAL_URL+"/"+serviceInfo.Service.Name) - } - } -} - -type ServiceTableItem struct { - Deployment string `json:"Deployment"` - Status string `json:"Status"` - Name string `json:"Name"` - DomainName string `json:"DomainName"` - Endpoints string `json:"Endpoints"` -} - -func printServiceStatesAndEndpoints(serviceInfos []*defangv1.ServiceInfo) error { - serviceTableItems := make([]ServiceTableItem, 0, len(serviceInfos)) - - showDomainNameColumn := false - showCertGenerateHint := false - hasPort := regexp.MustCompile(`:\d{1,5}$`) - - for _, serviceInfo := range serviceInfos { - var domainname string - if serviceInfo.Domainname != "" { - showDomainNameColumn = true - domainname = "https://" + serviceInfo.Domainname - if serviceInfo.ZoneId == "" { - showCertGenerateHint = true - } - } - endpoints := make([]string, 0, len(serviceInfo.Endpoints)) - for _, endpoint := range serviceInfo.Endpoints { - if !hasPort.MatchString(endpoint) { - endpoint = "https://" + endpoint - } - - endpoints = append(endpoints, endpoint) - } - if len(endpoints) == 0 { - endpoints = append(endpoints, "N/A") - } - - serviceTableItems = append(serviceTableItems, ServiceTableItem{ - Deployment: serviceInfo.Etag, - Name: serviceInfo.Service.Name, - Status: serviceInfo.State.String(), - DomainName: domainname, - Endpoints: strings.Join(endpoints, ", "), - }) - } - - attrs := []string{"Deployment", "Name", "Status", "Endpoints"} - if showDomainNameColumn { - attrs = append(attrs, "DomainName") - } - - err := term.Table(serviceTableItems, attrs) - if err != nil { - return err - } - - if showCertGenerateHint { - term.Info("Run `defang cert generate` to get a TLS certificate for your service(s)") - } - - return nil -} diff --git a/src/cmd/cli/command/deploymentinfo_test.go b/src/cmd/cli/command/deploymentinfo_test.go deleted file mode 100644 index 22eaf30ac..000000000 --- a/src/cmd/cli/command/deploymentinfo_test.go +++ /dev/null @@ -1,145 +0,0 @@ -package command - -import ( - "bytes" - "os" - "strings" - "testing" - - "github.com/DefangLabs/defang/src/pkg/cli" - cliClient "github.com/DefangLabs/defang/src/pkg/cli/client" - "github.com/DefangLabs/defang/src/pkg/term" - defangv1 "github.com/DefangLabs/defang/src/protos/io/defang/v1" -) - -func TestPrintPlaygroundPortalServiceURLs(t *testing.T) { - defaultTerm := term.DefaultTerm - t.Cleanup(func() { - term.DefaultTerm = defaultTerm - }) - - var stdout, stderr bytes.Buffer - term.DefaultTerm = term.NewTerm(os.Stdin, &stdout, &stderr) - - providerID = cliClient.ProviderDefang - cluster = cli.DefaultCluster - printPlaygroundPortalServiceURLs([]*defangv1.ServiceInfo{ - { - Service: &defangv1.Service{Name: "service1"}, - }}) - const want = ` * Monitor your services' status in the defang portal - - https://portal.defang.io/service/service1 -` - if got := stdout.String(); got != want { - t.Errorf("got %q, want %q", got, want) - } -} - -func TestPrintServiceStatesAndEndpointsAndDomainname(t *testing.T) { - defaultTerm := term.DefaultTerm - t.Cleanup(func() { - term.DefaultTerm = defaultTerm - }) - - var stdout, stderr bytes.Buffer - term.DefaultTerm = term.NewTerm(os.Stdin, &stdout, &stderr) - - tests := []struct { - name string - serviceinfos []*defangv1.ServiceInfo - expectedLines []string - }{ - { - name: "empty endpoint list", - serviceinfos: []*defangv1.ServiceInfo{ - { - Service: &defangv1.Service{ - Name: "service1", - Ports: []*defangv1.Port{ - {Mode: defangv1.Mode_INGRESS}, - {Mode: defangv1.Mode_HOST}, - }, - }, - Status: "UNKNOWN", - Domainname: "example.com", - Endpoints: []string{}, - }, - }, - expectedLines: []string{ - "DEPLOYMENT NAME STATUS ENDPOINTS DOMAINNAME", - " service1 NOT_SPECIFIED N/A https://example.com", - " * Run `defang cert generate` to get a TLS certificate for your service(s)", - "", - }, - }, - { - name: "Service with Domainname", - serviceinfos: []*defangv1.ServiceInfo{ - { - Service: &defangv1.Service{ - Name: "service1", - Ports: []*defangv1.Port{ - {Mode: defangv1.Mode_INGRESS}, - {Mode: defangv1.Mode_HOST}, - }, - }, - Status: "UNKNOWN", - Domainname: "example.com", - Endpoints: []string{ - "example.com", - "service1.internal:80", - }, - }, - }, - expectedLines: []string{ - "DEPLOYMENT NAME STATUS ENDPOINTS DOMAINNAME", - " service1 NOT_SPECIFIED https://example.com, service1.internal:80 https://example.com", - " * Run `defang cert generate` to get a TLS certificate for your service(s)", - "", - }, - }, - { - name: "endpoint without port", - serviceinfos: []*defangv1.ServiceInfo{ - { - Service: &defangv1.Service{ - Name: "service1", - Ports: []*defangv1.Port{ - {Mode: defangv1.Mode_INGRESS}, - {Mode: defangv1.Mode_HOST}, - }, - }, - Status: "UNKNOWN", - Endpoints: []string{ - "service1", - }, - }, - }, - expectedLines: []string{ - "DEPLOYMENT NAME STATUS ENDPOINTS", - " service1 NOT_SPECIFIED https://service1", - "", - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - // Reset stdout before each test - stdout.Reset() - - _ = printServiceStatesAndEndpoints(tt.serviceinfos) - receivedLines := strings.Split(stdout.String(), "\n") - - if len(receivedLines) != len(tt.expectedLines) { - t.Errorf("Expected %v lines, received %v", len(tt.expectedLines), len(receivedLines)) - } - - for i, receivedLine := range receivedLines { - receivedLine = strings.TrimRight(receivedLine, " ") - if receivedLine != tt.expectedLines[i] { - t.Errorf("\n-%v\n+%v", tt.expectedLines[i], receivedLine) - } - } - }) - } -} diff --git a/src/cmd/cli/command/version.go b/src/cmd/cli/command/version.go index 8d44f1e1e..4d6508d2d 100644 --- a/src/cmd/cli/command/version.go +++ b/src/cmd/cli/command/version.go @@ -1,14 +1,8 @@ package command import ( - "context" - "encoding/json" - "fmt" - "os" "strings" - "github.com/DefangLabs/defang/src/pkg/http" - "github.com/DefangLabs/defang/src/pkg/term" "golang.org/x/mod/semver" ) @@ -36,44 +30,3 @@ func GetCurrentVersion() string { version, _ := normalizeVersion(RootCmd.Version) return version } - -type githubError struct { - Message string - Status string - DocumentationUrl string -} - -func GetLatestVersion(ctx context.Context) (string, error) { - // Anonymous API request to GitHub are rate limited to 60 requests per hour per IP. - // Check whether the user has set a GitHub token to increase the rate limit. (Copied from the install script.) - githubToken := os.Getenv("GITHUB_TOKEN") - if githubToken == "" { - githubToken = os.Getenv("GH_TOKEN") - } - header := http.Header{} - if githubToken != "" { - header["Authorization"] = []string{"Bearer " + githubToken} - } - resp, err := http.GetWithHeader(ctx, "https://api.github.com/repos/DefangLabs/defang/releases/latest", header) - if err != nil { - return "", err - } - defer resp.Body.Close() - if resp.StatusCode != 200 { - term.Debug(resp.Header) - // The primary rate limit for unauthenticated requests is 60 requests per hour, per IP. - // The API returns a 403 status code when the rate limit is exceeded. - githubError := githubError{Message: resp.Status} - if err := json.NewDecoder(resp.Body).Decode(&githubError); err != nil { - term.Debugf("Failed to decode GitHub response: %v", err) - } - return "", fmt.Errorf("error fetching release info from GitHub: %s", githubError.Message) - } - var release struct { - TagName string `json:"tag_name"` - } - if err = json.NewDecoder(resp.Body).Decode(&release); err != nil { - return "", err - } - return release.TagName, nil -} diff --git a/src/cmd/cli/command/version_test.go b/src/cmd/cli/command/version_test.go index 1dcbefbbb..67e73057a 100644 --- a/src/cmd/cli/command/version_test.go +++ b/src/cmd/cli/command/version_test.go @@ -1,13 +1,8 @@ package command import ( - "context" "fmt" - "net/http" - "net/http/httptest" "testing" - - ourHttp "github.com/DefangLabs/defang/src/pkg/http" ) func TestIsNewer(t *testing.T) { @@ -52,56 +47,3 @@ func TestGetCurrentVersion(t *testing.T) { t.Errorf("GetCurrentVersion() = %v; want 1234567", ref) } } - -type mockRoundTripper struct { - method string - url string - resp *http.Response -} - -func (rt *mockRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { - if rt.method != "" && rt.method != req.Method { - return nil, fmt.Errorf("expected method %q; got %q", rt.method, req.Method) - } - if rt.url != "" && rt.url != req.URL.String() { - return nil, fmt.Errorf("expected URL %q; got %q", rt.url, req.URL.String()) - } - return rt.resp, nil -} - -func TestGetLatestVersion(t *testing.T) { - if testing.Short() { - t.Skip("skipping GitHub HTTP test in short mode to avoid rate limits.") - } - - ctx := context.Background() - - const version = "v1.2.3" - rec := httptest.NewRecorder() - rec.Header().Add("Content-Type", "application/json") - rec.WriteString(fmt.Sprintf(`{"tag_name":"%v"}`, version)) - response := rec.Result() - - client := ourHttp.DefaultClient - t.Cleanup(func() { - ourHttp.DefaultClient = client - response.Body.Close() - }) - - ourHttp.DefaultClient = &http.Client{Transport: &mockRoundTripper{ - method: http.MethodGet, - url: "https://api.github.com/repos/DefangLabs/defang/releases/latest", - resp: response, - }} - - v, err := GetLatestVersion(ctx) - if err != nil { - t.Fatalf("GetLatestVersion() error = %v; want nil", err) - } - if v == "" { - t.Fatalf("GetLatestVersion() = %v; want non-empty", v) - } - if v != version { - t.Errorf("GetLatestVersion() = %v; want %v", v, version) - } -} diff --git a/src/pkg/cli/client/byoc/aws/byoc.go b/src/pkg/cli/client/byoc/aws/byoc.go index e00f1352f..f8ee637f9 100644 --- a/src/pkg/cli/client/byoc/aws/byoc.go +++ b/src/pkg/cli/client/byoc/aws/byoc.go @@ -19,6 +19,7 @@ import ( "github.com/DefangLabs/defang/src/pkg/cli/client/byoc" "github.com/DefangLabs/defang/src/pkg/cli/compose" "github.com/DefangLabs/defang/src/pkg/clouds/aws" + "github.com/DefangLabs/defang/src/pkg/clouds/aws/cw" "github.com/DefangLabs/defang/src/pkg/clouds/aws/ecs" "github.com/DefangLabs/defang/src/pkg/clouds/aws/ecs/cfn" "github.com/DefangLabs/defang/src/pkg/dns" @@ -386,16 +387,19 @@ func (b *ByocAws) environment(projectName string) (map[string]string, error) { "DEFANG_JSON": os.Getenv("DEFANG_JSON"), "DEFANG_ORG": b.TenantName, "DEFANG_PREFIX": byoc.DefangPrefix, + "DEFANG_PREVIEW": "true", // always preview HACK "DEFANG_STATE_URL": defangStateUrl, "NODE_NO_WARNINGS": "1", "NPM_CONFIG_UPDATE_NOTIFIER": "false", "PRIVATE_DOMAIN": byoc.GetPrivateDomain(projectName), - "PROJECT": projectName, // may be empty - pulumiBackendKey: pulumiBackendValue, // TODO: make secret - "PULUMI_CONFIG_PASSPHRASE": byoc.PulumiConfigPassphrase, // TODO: make secret - "PULUMI_COPILOT": "false", - "PULUMI_SKIP_UPDATE_CHECK": "true", - "STACK": b.PulumiStack, + "PROJECT": projectName, // may be empty + pulumiBackendKey: pulumiBackendValue, // TODO: make secret + "PULUMI_AUTOMATION_API_SKIP_VERSION_CHECK": "true", + "PULUMI_CONFIG_PASSPHRASE": byoc.PulumiConfigPassphrase, // TODO: make secret + "PULUMI_COPILOT": "false", + "PULUMI_DIY_BACKEND_DISABLE_CHECKPOINT_BACKUPS": "true", // versioned bucket is used + "PULUMI_SKIP_UPDATE_CHECK": "true", + "STACK": b.PulumiStack, } if !term.StdoutCanColor() { @@ -537,6 +541,50 @@ func (b *ByocAws) GetServices(ctx context.Context, req *defangv1.GetServicesRequ listServiceResp.Project = projUpdate.Project } + /*if len(listServiceResp.Services) > 0 { + cfg, err := b.driver.LoadConfig(ctx) + if err != nil { + return nil, AnnotateAwsError(err) + } + + ecsClient := awsecs.NewFromConfig(cfg) // Ensure the ECS client is initialized + lso, err := ecsClient.ListServices(ctx, &awsecs.ListServicesInput{ + Cluster: ptr.String(b.driver.ClusterName), + MaxResults: ptr.Int32(100), // 100=maximum + }) + if err != nil { + return nil, AnnotateAwsError(err) + } + + var services []string + for _, service := range listServiceResp.Services { + // Find the physical service name + for _, ecsService := range lso.ServiceArns { + if strings.HasSuffix(*ecsService, service.Service.Name) { + // The physical service name is the one with the Pulumi suffix + services = append(services, service.Service.Name) //this is wrong, since the physical name has the Pulumi suffix + } + dso, err := ecsClient.DescribeServices(ctx, &awsecs.DescribeServicesInput{ + Cluster: ptr.String(b.driver.ClusterName), + Services: services, + }) + if err != nil { + return nil, AnnotateAwsError(err) + } + bytes, _ := json.Marshal(dso) + term.Debug(string(bytes)) + for _, service := range projUpdate.Services { + for _, ecsService := range dso.Services { + if *ecsService.ServiceName != service.Service.Name { + continue + } + ecsService.Deployments[0]. + service.Status = *ecsService.Status + break + } + } + }*/ + return &listServiceResp, nil } @@ -616,7 +664,7 @@ func (b *ByocAws) QueryForDebug(ctx context.Context, req *defangv1.DebugRequest) } // Gather logs from the CD task, kaniko, ECS events, and all services - evtsChan, errsChan := ecs.QueryLogGroups(ctx, start, end, b.getLogGroupInputs(req.Etag, req.Project, service, "", logs.LogTypeAll)...) + evtsChan, errsChan := cw.QueryLogGroups(ctx, start, end, b.getLogGroupInputs(req.Etag, req.Project, service, "", logs.LogTypeAll)...) if evtsChan == nil { return <-errsChan } @@ -680,7 +728,7 @@ func (b *ByocAws) QueryLogs(ctx context.Context, req *defangv1.TailRequest) (cli // * No Etag, service: tail all tasks/services with that service name // * Etag, service: tail that task/service var err error - var tailStream ecs.LiveTailStream + var tailStream cw.LiveTailStream if etag != "" && !pkg.IsValidRandomID(etag) { // Assume invalid "etag" is a task ID tailStream, err = b.driver.TailTaskID(ctx, etag) @@ -700,7 +748,7 @@ func (b *ByocAws) QueryLogs(ctx context.Context, req *defangv1.TailRequest) (cli if req.Until.IsValid() { end = req.Until.AsTime() } - tailStream, err = ecs.QueryAndTailLogGroups(ctx, start, end, b.getLogGroupInputs(etag, req.Project, service, req.Pattern, logs.LogType(req.LogType))...) + tailStream, err = cw.QueryAndTailLogGroups(ctx, start, end, b.getLogGroupInputs(etag, req.Project, service, req.Pattern, logs.LogType(req.LogType))...) } if err != nil { @@ -714,7 +762,7 @@ func (b *ByocAws) makeLogGroupARN(name string) string { return b.driver.MakeARN("logs", "log-group:"+name) } -func (b *ByocAws) getLogGroupInputs(etag types.ETag, projectName, service, filter string, logType logs.LogType) []ecs.LogGroupInput { +func (b *ByocAws) getLogGroupInputs(etag types.ETag, projectName, service, filter string, logType logs.LogType) []cw.LogGroupInput { // Escape the filter pattern to avoid problems with the CloudWatch Logs pattern syntax // See https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/FilterAndPatternSyntax.html var pattern string // TODO: add etag to filter @@ -722,26 +770,26 @@ func (b *ByocAws) getLogGroupInputs(etag types.ETag, projectName, service, filte pattern = strconv.Quote(filter) } - var groups []ecs.LogGroupInput + var groups []cw.LogGroupInput // Tail CD and kaniko if logType.Has(logs.LogTypeBuild) { - cdTail := ecs.LogGroupInput{LogGroupARN: b.driver.LogGroupARN, LogEventFilterPattern: pattern} // TODO: filter by etag + cdTail := cw.LogGroupInput{LogGroupARN: b.driver.LogGroupARN, LogEventFilterPattern: pattern} // TODO: filter by etag // If we know the CD task ARN, only tail the logstream for that CD task if b.cdTaskArn != nil && b.cdEtag == etag { cdTail.LogStreamNames = []string{ecs.GetCDLogStreamForTaskID(ecs.GetTaskID(b.cdTaskArn))} } groups = append(groups, cdTail) term.Debug("Query CD logs", cdTail.LogGroupARN, cdTail.LogStreamNames, filter) - kanikoTail := ecs.LogGroupInput{LogGroupARN: b.makeLogGroupARN(b.StackDir(projectName, "builds")), LogEventFilterPattern: pattern} // must match logic in ecs/common.ts; TODO: filter by etag/service + kanikoTail := cw.LogGroupInput{LogGroupARN: b.makeLogGroupARN(b.StackDir(projectName, "builds")), LogEventFilterPattern: pattern} // must match logic in ecs/common.ts; TODO: filter by etag/service term.Debug("Query kaniko logs", kanikoTail.LogGroupARN, filter) groups = append(groups, kanikoTail) - ecsTail := ecs.LogGroupInput{LogGroupARN: b.makeLogGroupARN(b.StackDir(projectName, "ecs")), LogEventFilterPattern: pattern} // must match logic in ecs/common.ts; TODO: filter by etag/service/deploymentId + ecsTail := cw.LogGroupInput{LogGroupARN: b.makeLogGroupARN(b.StackDir(projectName, "ecs")), LogEventFilterPattern: pattern} // must match logic in ecs/common.ts; TODO: filter by etag/service/deploymentId term.Debug("Query ecs events logs", ecsTail.LogGroupARN, filter) groups = append(groups, ecsTail) } // Tail services if logType.Has(logs.LogTypeRun) { - servicesTail := ecs.LogGroupInput{LogGroupARN: b.makeLogGroupARN(b.StackDir(projectName, "logs")), LogEventFilterPattern: pattern} // must match logic in ecs/common.ts + servicesTail := cw.LogGroupInput{LogGroupARN: b.makeLogGroupARN(b.StackDir(projectName, "logs")), LogEventFilterPattern: pattern} // must match logic in ecs/common.ts if service != "" && etag != "" { servicesTail.LogStreamNamePrefix = service + "/" + service + "_" + etag } diff --git a/src/pkg/cli/client/byoc/aws/byoc_integration_test.go b/src/pkg/cli/client/byoc/aws/byoc_integration_test.go index 36b3ed213..b3e524783 100644 --- a/src/pkg/cli/client/byoc/aws/byoc_integration_test.go +++ b/src/pkg/cli/client/byoc/aws/byoc_integration_test.go @@ -19,17 +19,6 @@ func TestDeploy(t *testing.T) { _, err := b.Deploy(context.Background(), &defangv1.DeployRequest{ Project: "byoc_integration_test", - Services: []*defangv1.Service{{ - Name: "test", - Image: "docker.io/library/nginx:latest", - Ports: []*defangv1.Port{{ - Target: 80, - Mode: defangv1.Mode_INGRESS, - }, { - Target: 443, - Mode: defangv1.Mode_INGRESS, - }}, - }}, }) if err == nil || !strings.Contains(err.Error(), "duplicate endpoint:") { t.Error("expected error") diff --git a/src/pkg/cli/client/byoc/aws/stream.go b/src/pkg/cli/client/byoc/aws/stream.go index 2b708f5f1..6a6f9f3b7 100644 --- a/src/pkg/cli/client/byoc/aws/stream.go +++ b/src/pkg/cli/client/byoc/aws/stream.go @@ -10,6 +10,7 @@ import ( "github.com/DefangLabs/defang/src/pkg" "github.com/DefangLabs/defang/src/pkg/cli/client" "github.com/DefangLabs/defang/src/pkg/cli/client/byoc" + "github.com/DefangLabs/defang/src/pkg/clouds/aws/cw" "github.com/DefangLabs/defang/src/pkg/clouds/aws/ecs" "github.com/DefangLabs/defang/src/pkg/logs" "github.com/DefangLabs/defang/src/pkg/term" @@ -23,12 +24,12 @@ type byocServerStream struct { etag string response *defangv1.TailResponse services []string - stream ecs.LiveTailStream + stream cw.LiveTailStream ecsEventsHandler ECSEventHandler } -func newByocServerStream(stream ecs.LiveTailStream, etag string, services []string, ecsEventHandler ECSEventHandler) *byocServerStream { +func newByocServerStream(stream cw.LiveTailStream, etag string, services []string, ecsEventHandler ECSEventHandler) *byocServerStream { return &byocServerStream{ etag: etag, stream: stream, @@ -61,7 +62,7 @@ func (bs *byocServerStream) Receive() bool { bs.err = AnnotateAwsError(err) return false } - evts, err := ecs.GetLogEvents(e) + evts, err := cw.GetLogEvents(e) if err != nil { bs.err = err return false @@ -70,7 +71,7 @@ func (bs *byocServerStream) Receive() bool { return true } -func (bs *byocServerStream) parseEvents(events []ecs.LogEvent) *defangv1.TailResponse { +func (bs *byocServerStream) parseEvents(events []cw.LogEvent) *defangv1.TailResponse { var response defangv1.TailResponse if len(events) == 0 { // The original gRPC/connect server stream would never send an empty response. diff --git a/src/pkg/cli/client/byoc/baseclient.go b/src/pkg/cli/client/byoc/baseclient.go index 876bc821e..ad9e84f5f 100644 --- a/src/pkg/cli/client/byoc/baseclient.go +++ b/src/pkg/cli/client/byoc/baseclient.go @@ -212,6 +212,7 @@ func (b *ByocBaseClient) update(ctx context.Context, projectName, delegateDomain pkg.Ensure(projectName != "", "ProjectName not set") si := &defangv1.ServiceInfo{ + Name: service.Name, AllowScaling: b.AllowScaling, Domainname: service.DomainName, Etag: pkg.RandomID(), // TODO: could be hash for dedup/idempotency @@ -227,14 +228,6 @@ func (b *ByocBaseClient) update(ctx context.Context, projectName, delegateDomain hasIngress = hasIngress || port.Mode == compose.Mode_INGRESS hasHost = hasHost || port.Mode == compose.Mode_HOST si.Endpoints = append(si.Endpoints, b.GetEndpoint(fqn, projectName, delegateDomain, &port)) - mode := defangv1.Mode_INGRESS - if port.Mode == compose.Mode_HOST { - mode = defangv1.Mode_HOST - } - si.Service.Ports = append(si.Service.Ports, &defangv1.Port{ - Target: port.Target, - Mode: mode, - }) } } else { si.PublicFqdn = b.GetPublicFqdn(projectName, delegateDomain, fqn) @@ -251,7 +244,7 @@ func (b *ByocBaseClient) update(ctx context.Context, projectName, delegateDomain si.Status = "UPDATE_QUEUED" si.State = defangv1.ServiceState_UPDATE_QUEUED if service.Build != nil { - si.Status = "BUILD_QUEUED" // in SaaS, this gets overwritten by the ECS events for "kaniko" + si.Status = "BUILD_QUEUED" // in Playground, this gets overwritten by the ECS events for "kaniko" si.State = defangv1.ServiceState_BUILD_QUEUED } diff --git a/src/pkg/cli/client/byoc/baseclient_test.go b/src/pkg/cli/client/byoc/baseclient_test.go index e590ed430..26a8bdcc8 100644 --- a/src/pkg/cli/client/byoc/baseclient_test.go +++ b/src/pkg/cli/client/byoc/baseclient_test.go @@ -82,7 +82,8 @@ var expectedServiceInfosJson = `[ "etag": "test-etag", "status": "UPDATE_QUEUED", "zone_id": "test-zone-id", - "state": 7 + "state": 7, + "name": "service3" }, { "service": { @@ -92,7 +93,8 @@ var expectedServiceInfosJson = `[ "etag": "test-etag", "status": "UPDATE_QUEUED", "zone_id": "test-zone-id", - "state": 7 + "state": 7, + "name": "service2" }, { "service": { @@ -102,7 +104,8 @@ var expectedServiceInfosJson = `[ "etag": "test-etag", "status": "UPDATE_QUEUED", "zone_id": "test-zone-id", - "state": 7 + "state": 7, + "name": "service1" } ]` diff --git a/src/pkg/cli/client/byoc/do/byoc.go b/src/pkg/cli/client/byoc/do/byoc.go index 86e7d374d..ff117b2f7 100644 --- a/src/pkg/cli/client/byoc/do/byoc.go +++ b/src/pkg/cli/client/byoc/do/byoc.go @@ -792,6 +792,7 @@ func (b *ByocDo) getAppByName(ctx context.Context, name string) (*godo.App, erro func processServiceInfo(service *godo.AppServiceSpec, projectName string) *defangv1.ServiceInfo { serviceInfo := &defangv1.ServiceInfo{ + Name: service.Name, Project: projectName, Etag: pkg.RandomID(), // TODO: get the real etag from spec somehow Service: &defangv1.Service{ diff --git a/src/pkg/cli/compose/fixup.go b/src/pkg/cli/compose/fixup.go index de2e8fb91..b0a4fd8b8 100644 --- a/src/pkg/cli/compose/fixup.go +++ b/src/pkg/cli/compose/fixup.go @@ -98,8 +98,8 @@ func FixupServices(ctx context.Context, provider client.Provider, project *compo } } - // Pack the build context into a Archive and upload if !strings.Contains(svccfg.Build.Context, "://") { + // Pack the build context into a Archive and upload url, err := getRemoteBuildContext(ctx, provider, project.Name, svccfg.Name, svccfg.Build, upload) if err != nil { return err diff --git a/src/pkg/cli/composeUp_test.go b/src/pkg/cli/composeUp_test.go index 9cb6135d7..c727e08b0 100644 --- a/src/pkg/cli/composeUp_test.go +++ b/src/pkg/cli/composeUp_test.go @@ -28,8 +28,8 @@ func (d mockDeployProvider) Deploy(ctx context.Context, req *defangv1.DeployRequ } func (mockDeployProvider) Preview(ctx context.Context, req *defangv1.DeployRequest) (*defangv1.DeployResponse, error) { - if req.Compose == nil && req.Services == nil { - return nil, errors.New("DeployRequest needs Compose or Services") + if len(req.Compose) == 0 { + return nil, errors.New("DeployRequest needs Compose") } project, err := compose.LoadFromContent(ctx, req.Compose, "") diff --git a/src/cmd/cli/command/configrandom.go b/src/pkg/cli/configrandom.go similarity index 95% rename from src/cmd/cli/command/configrandom.go rename to src/pkg/cli/configrandom.go index c46cfe6d0..a9ce329dd 100644 --- a/src/cmd/cli/command/configrandom.go +++ b/src/pkg/cli/configrandom.go @@ -1,4 +1,4 @@ -package command +package cli import ( "crypto/rand" diff --git a/src/cmd/cli/command/configrandom_test.go b/src/pkg/cli/configrandom_test.go similarity index 99% rename from src/cmd/cli/command/configrandom_test.go rename to src/pkg/cli/configrandom_test.go index 7f84a49fd..454dadf49 100644 --- a/src/cmd/cli/command/configrandom_test.go +++ b/src/pkg/cli/configrandom_test.go @@ -1,4 +1,4 @@ -package command +package cli import ( "testing" diff --git a/src/pkg/cli/deploymentinfo.go b/src/pkg/cli/deploymentinfo.go new file mode 100644 index 000000000..af8f3d7af --- /dev/null +++ b/src/pkg/cli/deploymentinfo.go @@ -0,0 +1,115 @@ +package cli + +import ( + "context" + "net/http" + "strings" + "sync" + "time" + + "github.com/DefangLabs/defang/src/pkg/term" + defangv1 "github.com/DefangLabs/defang/src/protos/io/defang/v1" +) + +type printService struct { + Deployment string + Endpoint string + Fqdn string // this is needed to set up any DNS records + Service string + State defangv1.ServiceState + Status string +} + +func PrintServiceStatesAndEndpoints(ctx context.Context, serviceInfos []*defangv1.ServiceInfo) error { + var serviceTableItems []*printService + + // showDomainNameColumn := false + showCertGenerateHint := false + + // Create a context with a timeout for HTTP requests + ctx, cancel := context.WithTimeout(ctx, 5*time.Second) + defer cancel() + var wg sync.WaitGroup + + for _, serviceInfo := range serviceInfos { + fqdn := serviceInfo.PublicFqdn + if fqdn == "" { + fqdn = serviceInfo.PrivateFqdn + } + + endpoint := "N/A" + if serviceInfo.Domainname != "" { + // showDomainNameColumn = true + endpoint = "https://" + serviceInfo.Domainname + if serviceInfo.UseAcmeCert { + showCertGenerateHint = true + } + } else if serviceInfo.PublicFqdn != "" { + endpoint = "https://" + serviceInfo.PublicFqdn + } else if serviceInfo.PrivateFqdn != "" { + endpoint = serviceInfo.PrivateFqdn + } + + ps := &printService{ + Deployment: serviceInfo.Etag, + Service: serviceInfo.Service.Name, + State: serviceInfo.State, + Status: serviceInfo.Status, + Endpoint: endpoint, + Fqdn: fqdn, + } + + if len(serviceInfo.Endpoints) == 0 { + serviceTableItems = append(serviceTableItems, ps) + continue + } + + for i, endpoint := range serviceInfo.Endpoints { + if i > 0 { + ps = &printService{} // reset + } + ps.Endpoint = endpoint + if !strings.Contains(endpoint, ":") { + ps.Endpoint = "https://" + endpoint + + wg.Add(1) + go func(ps *printService) { + defer wg.Done() + url := ps.Endpoint + serviceInfo.Healthcheck + // Use the regular net/http package to make the request without retries + req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) + if err != nil { + ps.Status = err.Error() + return + } + resp, err := http.DefaultClient.Do(req) + if err != nil { + ps.Status = err.Error() + return + } + defer resp.Body.Close() + ps.Status = resp.Status + }(ps) + } + + serviceTableItems = append(serviceTableItems, ps) + } + } + wg.Wait() + + attrs := []string{"Service", "Deployment", "State", "Fqdn", "Endpoint", "Status"} + // if showDomainNameColumn { + // attrs = append(attrs, "DomainName") + // } + + err := term.Table(serviceTableItems, attrs) + if err != nil { + return err + } + + if showCertGenerateHint { + term.Println("Run `defang cert generate` to get a TLS certificate for your service(s)") + } + + return nil +} diff --git a/src/pkg/cli/deploymentinfo_test.go b/src/pkg/cli/deploymentinfo_test.go new file mode 100644 index 000000000..009be74e1 --- /dev/null +++ b/src/pkg/cli/deploymentinfo_test.go @@ -0,0 +1,112 @@ +package cli + +import ( + "bytes" + "context" + "os" + "strings" + "testing" + + "github.com/DefangLabs/defang/src/pkg/term" + defangv1 "github.com/DefangLabs/defang/src/protos/io/defang/v1" +) + +func TestPrintServiceStatesAndEndpointsAndDomainname(t *testing.T) { + defaultTerm := term.DefaultTerm + t.Cleanup(func() { + term.DefaultTerm = defaultTerm + }) + + var stdout, stderr bytes.Buffer + term.DefaultTerm = term.NewTerm(os.Stdin, &stdout, &stderr) + + tests := []struct { + name string + serviceinfos []*defangv1.ServiceInfo + expectedLines []string + }{ + { + name: "empty endpoint list", + serviceinfos: []*defangv1.ServiceInfo{ + { + Service: &defangv1.Service{ + Name: "service1", + }, + UseAcmeCert: true, + Status: "UNKNOWN", + Domainname: "example.com", + Endpoints: []string{}, + }, + }, + expectedLines: []string{ + "SERVICE DEPLOYMENT STATE ENDPOINTS DOMAINNAME", + "service1 NOT_SPECIFIED N/A https://example.com", + "Run `defang cert generate` to get a TLS certificate for your service(s)", + "", + }, + }, + { + name: "Service with Domainname", + serviceinfos: []*defangv1.ServiceInfo{ + { + Service: &defangv1.Service{ + Name: "service1", + }, + UseAcmeCert: true, + Status: "UNKNOWN", + Domainname: "example.com", + Endpoints: []string{ + "example.com", + "service1.internal:80", + }, + }, + }, + expectedLines: []string{ + "SERVICE DEPLOYMENT STATE ENDPOINTS DOMAINNAME", + "service1 NOT_SPECIFIED https://example.com https://example.com", + "service1 NOT_SPECIFIED service1.internal:80 https://example.com", + "Run `defang cert generate` to get a TLS certificate for your service(s)", + "", + }, + }, + { + name: "endpoint without port", + serviceinfos: []*defangv1.ServiceInfo{ + { + Service: &defangv1.Service{ + Name: "service1", + }, + Status: "UNKNOWN", + Endpoints: []string{ + "service1", + }, + }, + }, + expectedLines: []string{ + "SERVICE DEPLOYMENT STATE ENDPOINTS", + "service1 NOT_SPECIFIED https://service1", + "", + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // Reset stdout before each test + stdout.Reset() + + _ = PrintServiceStatesAndEndpoints(context.Background(), tt.serviceinfos) + receivedLines := strings.Split(stdout.String(), "\n") + + if len(receivedLines) != len(tt.expectedLines) { + t.Errorf("Expected %v lines, received %v", len(tt.expectedLines), len(receivedLines)) + } + + for i, receivedLine := range receivedLines { + receivedLine = strings.TrimRight(receivedLine, " ") + if receivedLine != tt.expectedLines[i] { + t.Errorf("\n-%v\n+%v", tt.expectedLines[i], receivedLine) + } + } + }) + } +} diff --git a/src/pkg/cli/getServices.go b/src/pkg/cli/getServices.go index 25111831d..547106196 100644 --- a/src/pkg/cli/getServices.go +++ b/src/pkg/cli/getServices.go @@ -2,13 +2,10 @@ package cli import ( "context" - "fmt" - "time" "github.com/DefangLabs/defang/src/pkg/cli/client" "github.com/DefangLabs/defang/src/pkg/term" defangv1 "github.com/DefangLabs/defang/src/protos/io/defang/v1" - "google.golang.org/protobuf/types/known/timestamppb" ) type ErrNoServices struct { @@ -16,13 +13,7 @@ type ErrNoServices struct { } func (e ErrNoServices) Error() string { - return fmt.Sprintf("no services found in project %q", e.ProjectName) -} - -type printService struct { - Service string - Deployment string - *defangv1.ServiceInfo + return "no services found in project " + e.ProjectName // no quotes because ProjectName may be empty } func GetServices(ctx context.Context, projectName string, provider client.Provider, long bool) error { @@ -34,33 +25,13 @@ func GetServices(ctx context.Context, projectName string, provider client.Provid } numServices := len(servicesResponse.Services) - if numServices == 0 { return ErrNoServices{ProjectName: projectName} } if long { - // Truncate nanoseconds from timestamps for readability. - services := make([]*defangv1.ServiceInfo, 0, len(servicesResponse.Services)) - for _, si := range servicesResponse.Services { - si.CreatedAt = timestamppb.New(si.CreatedAt.AsTime().Truncate(time.Second)) - services = append(services, si) - } - - servicesResponse.Services = services - servicesResponse.ExpiresAt = timestamppb.New(servicesResponse.ExpiresAt.AsTime().Truncate(time.Second)) return PrintObject("", servicesResponse) } - printServices := make([]printService, numServices) - for i, si := range servicesResponse.Services { - printServices[i] = printService{ - Service: si.Service.Name, - Deployment: si.Etag, - ServiceInfo: si, - } - servicesResponse.Services[i] = nil - } - - return term.Table(printServices, []string{"Service", "Deployment", "PublicFqdn", "PrivateFqdn", "Status"}) + return PrintServiceStatesAndEndpoints(ctx, servicesResponse.Services) } diff --git a/src/pkg/cli/getServices_test.go b/src/pkg/cli/getServices_test.go index 771fb1686..995f92814 100644 --- a/src/pkg/cli/getServices_test.go +++ b/src/pkg/cli/getServices_test.go @@ -40,7 +40,7 @@ func (mockGetServicesHandler) GetServices(ctx context.Context, req *connect.Requ Service: &defangv1.Service{ Name: "foo", }, - Endpoints: []string{}, + Endpoints: []string{"test-foo--3000.prod1.defang.dev"}, Project: "test", Etag: "a1b2c3", Status: "UNKNOWN", @@ -85,8 +85,8 @@ func TestGetServices(t *testing.T) { if err != nil { t.Fatalf("GetServices() error = %v", err) } - expectedOutput := "\x1b[1m\nSERVICE DEPLOYMENT PUBLICFQDN PRIVATEFQDN STATUS\x1b[0m" + ` -foo a1b2c3 test-foo.prod1.defang.dev UNKNOWN + expectedOutput := "\x1b[1m\nSERVICE DEPLOYMENT STATE FQDN STATUS\x1b[0m" + ` +foo a1b2c3 NOT_SPECIFIED test-foo.prod1.defang.dev 404 Not Found ` receivedLines := strings.Split(stdout.String(), "\n") @@ -123,6 +123,8 @@ foo a1b2c3 test-foo.prod1.defang.dev UNKNOWN "project: test\n" + "services:\n" + " - createdAt: \"2021-09-01T12:34:56Z\"\n" + + " endpoints:\n" + + " - test-foo--3000.prod1.defang.dev\n" + " etag: a1b2c3\n" + " project: test\n" + " publicFqdn: test-foo.prod1.defang.dev\n" + diff --git a/src/pkg/clouds/aws/ecs/logs.go b/src/pkg/clouds/aws/cw/logs.go similarity index 99% rename from src/pkg/clouds/aws/ecs/logs.go rename to src/pkg/clouds/aws/cw/logs.go index 12f6e731d..ca784e8e7 100644 --- a/src/pkg/clouds/aws/ecs/logs.go +++ b/src/pkg/clouds/aws/cw/logs.go @@ -1,4 +1,4 @@ -package ecs +package cw import ( "context" diff --git a/src/pkg/clouds/aws/ecs/logs_test.go b/src/pkg/clouds/aws/cw/logs_test.go similarity index 64% rename from src/pkg/clouds/aws/ecs/logs_test.go rename to src/pkg/clouds/aws/cw/logs_test.go index 5057f5e97..d7bbf20ac 100644 --- a/src/pkg/clouds/aws/ecs/logs_test.go +++ b/src/pkg/clouds/aws/cw/logs_test.go @@ -1,4 +1,4 @@ -package ecs +package cw import ( "context" @@ -17,20 +17,6 @@ func TestLogGroupIdentifier(t *testing.T) { } } -func TestSplitClusterTask(t *testing.T) { - taskArn := "arn:aws:ecs:us-west-2:123456789012:task/cluster-name/12345678123412341234123456789012" - expectedClusterName := "cluster-name" - - clusterName, taskID := SplitClusterTask(&taskArn) - - if clusterName != expectedClusterName { - t.Errorf("Expected cluster name %q, but got %q", expectedClusterName, clusterName) - } - if taskID != "12345678123412341234123456789012" { - t.Errorf("Expected task ID %q, but got %q", taskArn, taskID) - } -} - func TestQueryAndTailLogGroups(t *testing.T) { e, err := QueryAndTailLogGroups(context.Background(), time.Now(), time.Time{}) if err != nil { diff --git a/src/pkg/clouds/aws/ecs/merge.go b/src/pkg/clouds/aws/cw/merge.go similarity index 98% rename from src/pkg/clouds/aws/ecs/merge.go rename to src/pkg/clouds/aws/cw/merge.go index 573fe6897..76672f0cd 100644 --- a/src/pkg/clouds/aws/ecs/merge.go +++ b/src/pkg/clouds/aws/cw/merge.go @@ -1,4 +1,4 @@ -package ecs +package cw // Inspired by https://dev.to/vinaygo/concurrency-merge-sort-using-channels-and-goroutines-in-golang-35f7 func Mergech[T any](left chan T, right chan T, c chan T, less func(T, T) bool) { diff --git a/src/pkg/clouds/aws/ecs/stream.go b/src/pkg/clouds/aws/cw/stream.go similarity index 99% rename from src/pkg/clouds/aws/ecs/stream.go rename to src/pkg/clouds/aws/cw/stream.go index 1ef92730b..4126812be 100644 --- a/src/pkg/clouds/aws/ecs/stream.go +++ b/src/pkg/clouds/aws/cw/stream.go @@ -1,4 +1,4 @@ -package ecs +package cw import ( "context" diff --git a/src/pkg/clouds/aws/ecs/stream_test.go b/src/pkg/clouds/aws/cw/stream_test.go similarity index 98% rename from src/pkg/clouds/aws/ecs/stream_test.go rename to src/pkg/clouds/aws/cw/stream_test.go index 8046a8270..74c564772 100644 --- a/src/pkg/clouds/aws/ecs/stream_test.go +++ b/src/pkg/clouds/aws/cw/stream_test.go @@ -1,6 +1,6 @@ //go:build integration -package ecs +package cw import ( "context" diff --git a/src/pkg/clouds/aws/ecs/event.go b/src/pkg/clouds/aws/ecs/event.go index 2935e8dfe..55cf7f3f7 100644 --- a/src/pkg/clouds/aws/ecs/event.go +++ b/src/pkg/clouds/aws/ecs/event.go @@ -236,11 +236,12 @@ func (e *KanikoTaskStateChangeEvent) Status() string { } var kanikoTaskStateMap = map[string]defangv1.ServiceState{ - // "STOPPED": defangv1.ServiceState_BUILD_STOPPING, // Ignored - "DEPROVISIONING": defangv1.ServiceState_BUILD_STOPPING, - "RUNNING": defangv1.ServiceState_BUILD_RUNNING, - "PENDING": defangv1.ServiceState_BUILD_PENDING, "PROVISIONING": defangv1.ServiceState_BUILD_PROVISIONING, + "PENDING": defangv1.ServiceState_BUILD_PENDING, + "ACTIVATING": defangv1.ServiceState_BUILD_ACTIVATING, + "RUNNING": defangv1.ServiceState_BUILD_RUNNING, + "DEPROVISIONING": defangv1.ServiceState_BUILD_STOPPING, + // "STOPPED": defangv1.ServiceState_BUILD_STOPPING, // Ignored } func (e *KanikoTaskStateChangeEvent) State() defangv1.ServiceState { diff --git a/src/pkg/clouds/aws/ecs/status_test.go b/src/pkg/clouds/aws/ecs/status_test.go new file mode 100644 index 000000000..99ced6ebc --- /dev/null +++ b/src/pkg/clouds/aws/ecs/status_test.go @@ -0,0 +1,17 @@ +package ecs + +import "testing" + +func TestSplitClusterTask(t *testing.T) { + taskArn := "arn:aws:ecs:us-west-2:123456789012:task/cluster-name/12345678123412341234123456789012" + expectedClusterName := "cluster-name" + + clusterName, taskID := SplitClusterTask(&taskArn) + + if clusterName != expectedClusterName { + t.Errorf("Expected cluster name %q, but got %q", expectedClusterName, clusterName) + } + if taskID != "12345678123412341234123456789012" { + t.Errorf("Expected task ID %q, but got %q", taskArn, taskID) + } +} diff --git a/src/pkg/clouds/aws/ecs/tail.go b/src/pkg/clouds/aws/ecs/tail.go index 40b7f96de..1929560b8 100644 --- a/src/pkg/clouds/aws/ecs/tail.go +++ b/src/pkg/clouds/aws/ecs/tail.go @@ -8,6 +8,7 @@ import ( "time" "github.com/DefangLabs/defang/src/pkg" + "github.com/DefangLabs/defang/src/pkg/clouds/aws/cw" "github.com/DefangLabs/defang/src/pkg/clouds/aws/region" "github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs/types" ) @@ -33,7 +34,7 @@ func (a *AwsEcs) Tail(ctx context.Context, taskArn TaskArn) error { for { select { case e := <-es.Events(): // blocking - events, err := GetLogEvents(e) + events, err := cw.GetLogEvents(e) // Print before checking for errors, so we don't lose any logs in case of EOF for _, event := range events { fmt.Println(*event.Message) @@ -57,13 +58,13 @@ func (a *AwsEcs) GetTaskArn(taskID string) (TaskArn, error) { return &taskArn, nil } -func (a *AwsEcs) TailTaskID(ctx context.Context, taskID string) (LiveTailStream, error) { +func (a *AwsEcs) TailTaskID(ctx context.Context, taskID string) (cw.LiveTailStream, error) { if taskID == "" { return nil, errors.New("taskID is empty") } - lgi := LogGroupInput{LogGroupARN: a.LogGroupARN, LogStreamNames: []string{GetCDLogStreamForTaskID(taskID)}} + lgi := cw.LogGroupInput{LogGroupARN: a.LogGroupARN, LogStreamNames: []string{GetCDLogStreamForTaskID(taskID)}} for { - stream, err := TailLogGroup(ctx, lgi) + stream, err := cw.TailLogGroup(ctx, lgi) if err != nil { var resourceNotFound *types.ResourceNotFoundException if !errors.As(err, &resourceNotFound) { diff --git a/src/pkg/github/version.go b/src/pkg/github/version.go new file mode 100644 index 000000000..45b93c633 --- /dev/null +++ b/src/pkg/github/version.go @@ -0,0 +1,54 @@ +package github + +import ( + "context" + "encoding/json" + "fmt" + "os" + + "github.com/DefangLabs/defang/src/pkg/http" + "github.com/DefangLabs/defang/src/pkg/term" +) + +const latestUrl = "https://api.github.com/repos/DefangLabs/defang/releases/latest" + +type githubError struct { + Message string + Status string + DocumentationUrl string +} + +func GetLatestReleaseTag(ctx context.Context) (string, error) { + // Anonymous API request to GitHub are rate limited to 60 requests per hour per IP. + // Check whether the user has set a GitHub token to increase the rate limit. (Copied from the install script.) + githubToken := os.Getenv("GITHUB_TOKEN") + if githubToken == "" { + githubToken = os.Getenv("GH_TOKEN") + } + header := http.Header{} + if githubToken != "" { + header.Set("Authorization", "Bearer "+githubToken) + } + resp, err := http.GetWithHeader(ctx, latestUrl, header) + if err != nil { + return "", err + } + defer resp.Body.Close() + if resp.StatusCode != 200 { + term.Debug(resp.Header) + // The primary rate limit for unauthenticated requests is 60 requests per hour, per IP. + // The API returns a 403 status code when the rate limit is exceeded. + githubError := githubError{Message: resp.Status} + if err := json.NewDecoder(resp.Body).Decode(&githubError); err != nil { + term.Debugf("Failed to decode GitHub response: %v", err) + } + return "", fmt.Errorf("error fetching release info from GitHub: %s", githubError.Message) + } + var release struct { + TagName string `json:"tag_name"` + } + if err = json.NewDecoder(resp.Body).Decode(&release); err != nil { + return "", err + } + return release.TagName, nil +} diff --git a/src/pkg/github/version_test.go b/src/pkg/github/version_test.go new file mode 100644 index 000000000..086974d38 --- /dev/null +++ b/src/pkg/github/version_test.go @@ -0,0 +1,64 @@ +package github + +import ( + "context" + "fmt" + "net/http" + "net/http/httptest" + "testing" + + ourHttp "github.com/DefangLabs/defang/src/pkg/http" +) + +type mockRoundTripper struct { + method string + url string + resp *http.Response +} + +func (rt *mockRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + if rt.method != "" && rt.method != req.Method { + return nil, fmt.Errorf("expected method %q; got %q", rt.method, req.Method) + } + if rt.url != "" && rt.url != req.URL.String() { + return nil, fmt.Errorf("expected URL %q; got %q", rt.url, req.URL.String()) + } + return rt.resp, nil +} + +func TestGetLatestVersion(t *testing.T) { + if testing.Short() { + t.Skip("skipping GitHub HTTP test in short mode to avoid rate limits.") + } + + ctx := context.Background() + + const version = "v1.2.3" + rec := httptest.NewRecorder() + rec.Header().Add("Content-Type", "application/json") + rec.WriteString(fmt.Sprintf(`{"tag_name":"%v"}`, version)) + response := rec.Result() + + client := ourHttp.DefaultClient + t.Cleanup(func() { + ourHttp.DefaultClient = client + response.Body.Close() + }) + + ourHttp.DefaultClient = &http.Client{Transport: &mockRoundTripper{ + method: http.MethodGet, + url: "https://api.github.com/repos/DefangLabs/defang/releases/latest", + resp: response, + }} + + v, err := GetLatestReleaseTag(ctx) + if err != nil { + t.Fatalf("GetLatestVersion() error = %v; want nil", err) + } + if v == "" { + t.Fatalf("GetLatestVersion() = %v; want non-empty", v) + } + if v != version { + t.Errorf("GetLatestVersion() = %v; want %v", v, version) + } +} diff --git a/src/pkg/mcp/deployment_info/deployment_info.go b/src/pkg/mcp/deployment_info/deployment_info.go index 6a0109c47..c289d47d0 100644 --- a/src/pkg/mcp/deployment_info/deployment_info.go +++ b/src/pkg/mcp/deployment_info/deployment_info.go @@ -17,7 +17,7 @@ func (e ErrNoServices) Error() string { return fmt.Sprintf("no services found in project %q", e.ProjectName) } -type Service struct { +type serviceInfo struct { Service string DeploymentId string PublicFqdn string @@ -25,7 +25,7 @@ type Service struct { Status string } -func GetServices(ctx context.Context, projectName string, provider client.Provider) ([]Service, error) { +func GetDeploymentInfo(ctx context.Context, projectName string, provider client.Provider) ([]serviceInfo, error) { term.Debugf("Listing services in project %q", projectName) term.Debug("Function invoked: provider.GetServices") @@ -40,9 +40,9 @@ func GetServices(ctx context.Context, projectName string, provider client.Provid return nil, ErrNoServices{ProjectName: projectName} } - result := make([]Service, numServices) + result := make([]serviceInfo, numServices) for i, si := range getServicesResponse.Services { - result[i] = Service{ + result[i] = serviceInfo{ Service: si.Service.Name, DeploymentId: si.Etag, PublicFqdn: si.PublicFqdn, diff --git a/src/pkg/mcp/tools/services.go b/src/pkg/mcp/tools/services.go index 452f4929b..80d78e772 100644 --- a/src/pkg/mcp/tools/services.go +++ b/src/pkg/mcp/tools/services.go @@ -71,7 +71,7 @@ func setupServicesTool(s *server.MCPServer, cluster string, providerId cliClient return mcp.NewToolResultErrorFromErr("Failed to load project name", err), nil } - serviceResponse, err := deployment_info.GetServices(ctx, projectName, provider) + serviceResponse, err := deployment_info.GetDeploymentInfo(ctx, projectName, provider) if err != nil { var noServicesErr cli.ErrNoServices if errors.As(err, &noServicesErr) { diff --git a/src/pkg/term/input.go b/src/pkg/term/input.go index 2ebaeca8a..8c09437fa 100644 --- a/src/pkg/term/input.go +++ b/src/pkg/term/input.go @@ -4,6 +4,7 @@ import ( "errors" "io" "os" + "syscall" "github.com/ross96D/cancelreader" ) @@ -28,7 +29,7 @@ func (n *nonBlockingStdin) Close() error { func NewNonBlockingStdin() io.ReadCloser { cr, err := cancelreader.NewReader(os.Stdin) if err != nil { - return os.Stdin + return os.NewFile(uintptr(syscall.Stdin), "/dev/stdin") } return &nonBlockingStdin{cr} } diff --git a/src/pkg/types/driver.go b/src/pkg/types/driver.go index 20947d393..3506520d0 100644 --- a/src/pkg/types/driver.go +++ b/src/pkg/types/driver.go @@ -12,10 +12,9 @@ type TaskID *string type ContainerCondition string const ( - ContainerStarted ContainerCondition = "START" - ContainerComplete = "COMPLETE" - ContainerSuccess = "SUCCESS" - ContainerHealthy = "HEALTHY" + ContainerStarted ContainerCondition = "START" + ContainerSuccess ContainerCondition = "SUCCESS" + ContainerHealthy ContainerCondition = "HEALTHY" ) type Container struct { diff --git a/src/protos/io/defang/v1/fabric.pb.go b/src/protos/io/defang/v1/fabric.pb.go index a77f6ad74..f71613792 100644 --- a/src/protos/io/defang/v1/fabric.pb.go +++ b/src/protos/io/defang/v1/fabric.pb.go @@ -357,212 +357,6 @@ func (DeploymentAction) EnumDescriptor() ([]byte, []int) { return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{5} } -// Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. -type Platform int32 - -const ( - Platform_LINUX_AMD64 Platform = 0 - Platform_LINUX_ARM64 Platform = 1 - Platform_LINUX_ANY Platform = 2 -) - -// Enum value maps for Platform. -var ( - Platform_name = map[int32]string{ - 0: "LINUX_AMD64", - 1: "LINUX_ARM64", - 2: "LINUX_ANY", - } - Platform_value = map[string]int32{ - "LINUX_AMD64": 0, - "LINUX_ARM64": 1, - "LINUX_ANY": 2, - } -) - -func (x Platform) Enum() *Platform { - p := new(Platform) - *p = x - return p -} - -func (x Platform) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (Platform) Descriptor() protoreflect.EnumDescriptor { - return file_io_defang_v1_fabric_proto_enumTypes[6].Descriptor() -} - -func (Platform) Type() protoreflect.EnumType { - return &file_io_defang_v1_fabric_proto_enumTypes[6] -} - -func (x Platform) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use Platform.Descriptor instead. -func (Platform) EnumDescriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{6} -} - -// Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. -type Protocol int32 - -const ( - Protocol_ANY Protocol = 0 // unspecified means any protocol - Protocol_UDP Protocol = 1 - Protocol_TCP Protocol = 2 - Protocol_HTTP Protocol = 3 - Protocol_HTTP2 Protocol = 4 - Protocol_GRPC Protocol = 5 // HTTP/2 with gRPC health checks -) - -// Enum value maps for Protocol. -var ( - Protocol_name = map[int32]string{ - 0: "ANY", - 1: "UDP", - 2: "TCP", - 3: "HTTP", - 4: "HTTP2", - 5: "GRPC", - } - Protocol_value = map[string]int32{ - "ANY": 0, - "UDP": 1, - "TCP": 2, - "HTTP": 3, - "HTTP2": 4, - "GRPC": 5, - } -) - -func (x Protocol) Enum() *Protocol { - p := new(Protocol) - *p = x - return p -} - -func (x Protocol) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (Protocol) Descriptor() protoreflect.EnumDescriptor { - return file_io_defang_v1_fabric_proto_enumTypes[7].Descriptor() -} - -func (Protocol) Type() protoreflect.EnumType { - return &file_io_defang_v1_fabric_proto_enumTypes[7] -} - -func (x Protocol) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use Protocol.Descriptor instead. -func (Protocol) EnumDescriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{7} -} - -// Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. -type Mode int32 - -const ( - Mode_HOST Mode = 0 // no load-balancer; suitable for internal services and functions - Mode_INGRESS Mode = 1 // with load-balancer; suitable for public services -) - -// Enum value maps for Mode. -var ( - Mode_name = map[int32]string{ - 0: "HOST", - 1: "INGRESS", - } - Mode_value = map[string]int32{ - "HOST": 0, - "INGRESS": 1, - } -) - -func (x Mode) Enum() *Mode { - p := new(Mode) - *p = x - return p -} - -func (x Mode) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (Mode) Descriptor() protoreflect.EnumDescriptor { - return file_io_defang_v1_fabric_proto_enumTypes[8].Descriptor() -} - -func (Mode) Type() protoreflect.EnumType { - return &file_io_defang_v1_fabric_proto_enumTypes[8] -} - -func (x Mode) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use Mode.Descriptor instead. -func (Mode) EnumDescriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{8} -} - -// Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. -type Network int32 - -const ( - Network_UNSPECIFIED Network = 0 // was: internal=false - Network_PRIVATE Network = 1 // was: internal=true - Network_PUBLIC Network = 2 -) - -// Enum value maps for Network. -var ( - Network_name = map[int32]string{ - 0: "UNSPECIFIED", - 1: "PRIVATE", - 2: "PUBLIC", - } - Network_value = map[string]int32{ - "UNSPECIFIED": 0, - "PRIVATE": 1, - "PUBLIC": 2, - } -) - -func (x Network) Enum() *Network { - p := new(Network) - *p = x - return p -} - -func (x Network) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (Network) Descriptor() protoreflect.EnumDescriptor { - return file_io_defang_v1_fabric_proto_enumTypes[9].Descriptor() -} - -func (Network) Type() protoreflect.EnumType { - return &file_io_defang_v1_fabric_proto_enumTypes[9] -} - -func (x Network) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use Network.Descriptor instead. -func (Network) EnumDescriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{9} -} - type SubscriptionTier int32 const ( @@ -602,11 +396,11 @@ func (x SubscriptionTier) String() string { } func (SubscriptionTier) Descriptor() protoreflect.EnumDescriptor { - return file_io_defang_v1_fabric_proto_enumTypes[10].Descriptor() + return file_io_defang_v1_fabric_proto_enumTypes[6].Descriptor() } func (SubscriptionTier) Type() protoreflect.EnumType { - return &file_io_defang_v1_fabric_proto_enumTypes[10] + return &file_io_defang_v1_fabric_proto_enumTypes[6] } func (x SubscriptionTier) Number() protoreflect.EnumNumber { @@ -615,7 +409,7 @@ func (x SubscriptionTier) Number() protoreflect.EnumNumber { // Deprecated: Use SubscriptionTier.Descriptor instead. func (SubscriptionTier) EnumDescriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{10} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{6} } type TailRequest_LogType int32 @@ -654,11 +448,11 @@ func (x TailRequest_LogType) String() string { } func (TailRequest_LogType) Descriptor() protoreflect.EnumDescriptor { - return file_io_defang_v1_fabric_proto_enumTypes[11].Descriptor() + return file_io_defang_v1_fabric_proto_enumTypes[7].Descriptor() } func (TailRequest_LogType) Type() protoreflect.EnumType { - return &file_io_defang_v1_fabric_proto_enumTypes[11] + return &file_io_defang_v1_fabric_proto_enumTypes[7] } func (x TailRequest_LogType) Number() protoreflect.EnumNumber { @@ -1445,8 +1239,6 @@ func (x *CanIUseResponse) GetPulumiVersion() string { type DeployRequest struct { state protoimpl.MessageState `protogen:"open.v1"` // Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. - Services []*Service `protobuf:"bytes,1,rep,name=services,proto3" json:"services,omitempty"` // deprecated; use compose - // Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. Project string `protobuf:"bytes,2,opt,name=project,proto3" json:"project,omitempty"` // deprecated; use compose.name Mode DeploymentMode `protobuf:"varint,3,opt,name=mode,proto3,enum=io.defang.v1.DeploymentMode" json:"mode,omitempty"` Compose []byte `protobuf:"bytes,4,opt,name=compose,proto3" json:"compose,omitempty"` // yaml (or json) @@ -1488,14 +1280,6 @@ func (*DeployRequest) Descriptor() ([]byte, []int) { return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{13} } -// Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. -func (x *DeployRequest) GetServices() []*Service { - if x != nil { - return x.Services - } - return nil -} - // Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. func (x *DeployRequest) GetProject() string { if x != nil { @@ -2071,6 +1855,8 @@ type ServiceInfo struct { Domainname string `protobuf:"bytes,16,opt,name=domainname,proto3" json:"domainname,omitempty"` // domain name for the service LbDnsName string `protobuf:"bytes,17,opt,name=lb_dns_name,json=lbDnsName,proto3" json:"lb_dns_name,omitempty"` // fully qualified domain name for the load-balancer AllowScaling bool `protobuf:"varint,18,opt,name=allow_scaling,json=allowScaling,proto3" json:"allow_scaling,omitempty"` // true if service is allowed to autoscale + Healthcheck string `protobuf:"bytes,19,opt,name=healthcheck,proto3" json:"healthcheck,omitempty"` // healthcheck path + Name string `protobuf:"bytes,20,opt,name=name,proto3" json:"name,omitempty"` // name of the service unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -2224,6 +2010,20 @@ func (x *ServiceInfo) GetAllowScaling() bool { return false } +func (x *ServiceInfo) GetHealthcheck() string { + if x != nil { + return x.Healthcheck + } + return "" +} + +func (x *ServiceInfo) GetName() string { + if x != nil { + return x.Name + } + return "" +} + // Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. type Secrets struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -3559,7 +3359,7 @@ type ProjectUpdate struct { Mode DeploymentMode `protobuf:"varint,6,opt,name=mode,proto3,enum=io.defang.v1.DeploymentMode" json:"mode,omitempty"` Provider Provider `protobuf:"varint,7,opt,name=provider,proto3,enum=io.defang.v1.Provider" json:"provider,omitempty"` ProjectOutputsVersion uint32 `protobuf:"varint,8,opt,name=project_outputs_version,json=projectOutputsVersion,proto3" json:"project_outputs_version,omitempty"` - ProjectOutputs []byte `protobuf:"bytes,9,opt,name=project_outputs,json=projectOutputs,proto3" json:"project_outputs,omitempty"` // JSON serialization of pulumi outputs. schema versioned using project_outputs_version + ProjectOutputs []byte `protobuf:"bytes,9,opt,name=project_outputs,json=projectOutputs,proto3" json:"project_outputs,omitempty"` // JSON serialization of pulumi outputs. schema unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -3658,8 +3458,7 @@ func (x *ProjectUpdate) GetProjectOutputs() []byte { return nil } -// Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. -type ServiceID struct { +type GetRequest struct { state protoimpl.MessageState `protogen:"open.v1"` Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` Project string `protobuf:"bytes,2,opt,name=project,proto3" json:"project,omitempty"` @@ -3667,20 +3466,20 @@ type ServiceID struct { sizeCache protoimpl.SizeCache } -func (x *ServiceID) Reset() { - *x = ServiceID{} +func (x *GetRequest) Reset() { + *x = GetRequest{} mi := &file_io_defang_v1_fabric_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ServiceID) String() string { +func (x *GetRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ServiceID) ProtoMessage() {} +func (*GetRequest) ProtoMessage() {} -func (x *ServiceID) ProtoReflect() protoreflect.Message { +func (x *GetRequest) ProtoReflect() protoreflect.Message { mi := &file_io_defang_v1_fabric_proto_msgTypes[48] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -3692,47 +3491,48 @@ func (x *ServiceID) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ServiceID.ProtoReflect.Descriptor instead. -func (*ServiceID) Descriptor() ([]byte, []int) { +// Deprecated: Use GetRequest.ProtoReflect.Descriptor instead. +func (*GetRequest) Descriptor() ([]byte, []int) { return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{48} } -func (x *ServiceID) GetName() string { +func (x *GetRequest) GetName() string { if x != nil { return x.Name } return "" } -func (x *ServiceID) GetProject() string { +func (x *GetRequest) GetProject() string { if x != nil { return x.Project } return "" } -type GetRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Project string `protobuf:"bytes,2,opt,name=project,proto3" json:"project,omitempty"` +// Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. +type Service struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // use ServiceInfo.name unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *GetRequest) Reset() { - *x = GetRequest{} +func (x *Service) Reset() { + *x = Service{} mi := &file_io_defang_v1_fabric_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *GetRequest) String() string { +func (x *Service) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetRequest) ProtoMessage() {} +func (*Service) ProtoMessage() {} -func (x *GetRequest) ProtoReflect() protoreflect.Message { +func (x *Service) ProtoReflect() protoreflect.Message { mi := &file_io_defang_v1_fabric_proto_msgTypes[49] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -3744,49 +3544,49 @@ func (x *GetRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetRequest.ProtoReflect.Descriptor instead. -func (*GetRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use Service.ProtoReflect.Descriptor instead. +func (*Service) Descriptor() ([]byte, []int) { return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{49} } -func (x *GetRequest) GetName() string { +// Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. +func (x *Service) GetName() string { if x != nil { return x.Name } return "" } -func (x *GetRequest) GetProject() string { - if x != nil { - return x.Project - } - return "" -} - // Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. -type Device struct { - state protoimpl.MessageState `protogen:"open.v1"` - Capabilities []string `protobuf:"bytes,1,rep,name=capabilities,proto3" json:"capabilities,omitempty"` // "gpu", "tpu", etc. - Driver string `protobuf:"bytes,2,opt,name=driver,proto3" json:"driver,omitempty"` // "nvidia", "amd", etc. - Count uint32 `protobuf:"varint,3,opt,name=count,proto3" json:"count,omitempty"` // number of devices to reserve - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache +type Event struct { + state protoimpl.MessageState `protogen:"open.v1"` + Specversion string `protobuf:"bytes,1,opt,name=specversion,proto3" json:"specversion,omitempty"` // required (but we don't care) + Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` // required + Source string `protobuf:"bytes,3,opt,name=source,proto3" json:"source,omitempty"` // required + Id string `protobuf:"bytes,4,opt,name=id,proto3" json:"id,omitempty"` // required + Datacontenttype string `protobuf:"bytes,5,opt,name=datacontenttype,proto3" json:"datacontenttype,omitempty"` + Dataschema string `protobuf:"bytes,6,opt,name=dataschema,proto3" json:"dataschema,omitempty"` + Subject string `protobuf:"bytes,7,opt,name=subject,proto3" json:"subject,omitempty"` + Time *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=time,proto3" json:"time,omitempty"` + Data []byte `protobuf:"bytes,9,opt,name=data,proto3" json:"data,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *Device) Reset() { - *x = Device{} +func (x *Event) Reset() { + *x = Event{} mi := &file_io_defang_v1_fabric_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *Device) String() string { +func (x *Event) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Device) ProtoMessage() {} +func (*Event) ProtoMessage() {} -func (x *Device) ProtoReflect() protoreflect.Message { +func (x *Event) ProtoReflect() protoreflect.Message { mi := &file_io_defang_v1_fabric_proto_msgTypes[50] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -3798,932 +3598,63 @@ func (x *Device) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Device.ProtoReflect.Descriptor instead. -func (*Device) Descriptor() ([]byte, []int) { +// Deprecated: Use Event.ProtoReflect.Descriptor instead. +func (*Event) Descriptor() ([]byte, []int) { return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{50} } -func (x *Device) GetCapabilities() []string { +func (x *Event) GetSpecversion() string { if x != nil { - return x.Capabilities + return x.Specversion } - return nil + return "" } -func (x *Device) GetDriver() string { +func (x *Event) GetType() string { if x != nil { - return x.Driver + return x.Type } return "" } -func (x *Device) GetCount() uint32 { +func (x *Event) GetSource() string { if x != nil { - return x.Count + return x.Source } - return 0 -} - -// Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. -type Resource struct { - state protoimpl.MessageState `protogen:"open.v1"` - Memory float32 `protobuf:"fixed32,1,opt,name=memory,proto3" json:"memory,omitempty"` // in MiB - Cpus float32 `protobuf:"fixed32,2,opt,name=cpus,proto3" json:"cpus,omitempty"` // fractional vCPUs - Devices []*Device `protobuf:"bytes,3,rep,name=devices,proto3" json:"devices,omitempty"` // devices & capabilities - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *Resource) Reset() { - *x = Resource{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[51] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *Resource) String() string { - return protoimpl.X.MessageStringOf(x) + return "" } -func (*Resource) ProtoMessage() {} - -func (x *Resource) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[51] +func (x *Event) GetId() string { if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms + return x.Id } - return mi.MessageOf(x) + return "" } -// Deprecated: Use Resource.ProtoReflect.Descriptor instead. -func (*Resource) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{51} +func (x *Event) GetDatacontenttype() string { + if x != nil { + return x.Datacontenttype + } + return "" } -func (x *Resource) GetMemory() float32 { +func (x *Event) GetDataschema() string { if x != nil { - return x.Memory + return x.Dataschema } - return 0 + return "" } -func (x *Resource) GetCpus() float32 { +func (x *Event) GetSubject() string { if x != nil { - return x.Cpus + return x.Subject } - return 0 + return "" } -func (x *Resource) GetDevices() []*Device { +func (x *Event) GetTime() *timestamppb.Timestamp { if x != nil { - return x.Devices - } - return nil -} - -// Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. -type Resources struct { - state protoimpl.MessageState `protogen:"open.v1"` - Reservations *Resource `protobuf:"bytes,1,opt,name=reservations,proto3" json:"reservations,omitempty"` // requested resources - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *Resources) Reset() { - *x = Resources{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[52] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *Resources) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Resources) ProtoMessage() {} - -func (x *Resources) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[52] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Resources.ProtoReflect.Descriptor instead. -func (*Resources) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{52} -} - -func (x *Resources) GetReservations() *Resource { - if x != nil { - return x.Reservations - } - return nil -} - -// Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. -type Deploy struct { - state protoimpl.MessageState `protogen:"open.v1"` - Replicas uint32 `protobuf:"varint,1,opt,name=replicas,proto3" json:"replicas,omitempty"` // number of initial replicas - Resources *Resources `protobuf:"bytes,2,opt,name=resources,proto3" json:"resources,omitempty"` // reservations and limits - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *Deploy) Reset() { - *x = Deploy{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[53] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *Deploy) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Deploy) ProtoMessage() {} - -func (x *Deploy) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[53] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Deploy.ProtoReflect.Descriptor instead. -func (*Deploy) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{53} -} - -func (x *Deploy) GetReplicas() uint32 { - if x != nil { - return x.Replicas - } - return 0 -} - -func (x *Deploy) GetResources() *Resources { - if x != nil { - return x.Resources - } - return nil -} - -// Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. -type Port struct { - state protoimpl.MessageState `protogen:"open.v1"` - Target uint32 `protobuf:"varint,1,opt,name=target,proto3" json:"target,omitempty"` - Protocol Protocol `protobuf:"varint,2,opt,name=protocol,proto3,enum=io.defang.v1.Protocol" json:"protocol,omitempty"` - Mode Mode `protobuf:"varint,3,opt,name=mode,proto3,enum=io.defang.v1.Mode" json:"mode,omitempty"` // load-balanced (ingress) or not (host) - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *Port) Reset() { - *x = Port{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[54] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *Port) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Port) ProtoMessage() {} - -func (x *Port) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[54] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Port.ProtoReflect.Descriptor instead. -func (*Port) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{54} -} - -func (x *Port) GetTarget() uint32 { - if x != nil { - return x.Target - } - return 0 -} - -func (x *Port) GetProtocol() Protocol { - if x != nil { - return x.Protocol - } - return Protocol_ANY -} - -func (x *Port) GetMode() Mode { - if x != nil { - return x.Mode - } - return Mode_HOST -} - -// Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. -type Secret struct { - state protoimpl.MessageState `protogen:"open.v1"` - Source string `protobuf:"bytes,1,opt,name=source,proto3" json:"source,omitempty"` // name of the secret - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *Secret) Reset() { - *x = Secret{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[55] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *Secret) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Secret) ProtoMessage() {} - -func (x *Secret) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[55] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Secret.ProtoReflect.Descriptor instead. -func (*Secret) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{55} -} - -func (x *Secret) GetSource() string { - if x != nil { - return x.Source - } - return "" -} - -// Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. -type Build struct { - state protoimpl.MessageState `protogen:"open.v1"` - Context string `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` // path or URL to the build context - Dockerfile string `protobuf:"bytes,2,opt,name=dockerfile,proto3" json:"dockerfile,omitempty"` // path to the Dockerfile - Args map[string]string `protobuf:"bytes,3,rep,name=args,proto3" json:"args,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` // build-time variables - ShmSize float32 `protobuf:"fixed32,4,opt,name=shm_size,json=shmSize,proto3" json:"shm_size,omitempty"` // in MiB - Target string `protobuf:"bytes,5,opt,name=target,proto3" json:"target,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *Build) Reset() { - *x = Build{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[56] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *Build) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Build) ProtoMessage() {} - -func (x *Build) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[56] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Build.ProtoReflect.Descriptor instead. -func (*Build) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{56} -} - -func (x *Build) GetContext() string { - if x != nil { - return x.Context - } - return "" -} - -func (x *Build) GetDockerfile() string { - if x != nil { - return x.Dockerfile - } - return "" -} - -func (x *Build) GetArgs() map[string]string { - if x != nil { - return x.Args - } - return nil -} - -func (x *Build) GetShmSize() float32 { - if x != nil { - return x.ShmSize - } - return 0 -} - -func (x *Build) GetTarget() string { - if x != nil { - return x.Target - } - return "" -} - -// Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. -type HealthCheck struct { - state protoimpl.MessageState `protogen:"open.v1"` - Test []string `protobuf:"bytes,1,rep,name=test,proto3" json:"test,omitempty"` - Interval uint32 `protobuf:"varint,2,opt,name=interval,proto3" json:"interval,omitempty"` // in seconds - Timeout uint32 `protobuf:"varint,3,opt,name=timeout,proto3" json:"timeout,omitempty"` // in seconds; must be less than interval - Retries uint32 `protobuf:"varint,4,opt,name=retries,proto3" json:"retries,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *HealthCheck) Reset() { - *x = HealthCheck{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[57] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *HealthCheck) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*HealthCheck) ProtoMessage() {} - -func (x *HealthCheck) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[57] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use HealthCheck.ProtoReflect.Descriptor instead. -func (*HealthCheck) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{57} -} - -func (x *HealthCheck) GetTest() []string { - if x != nil { - return x.Test - } - return nil -} - -func (x *HealthCheck) GetInterval() uint32 { - if x != nil { - return x.Interval - } - return 0 -} - -func (x *HealthCheck) GetTimeout() uint32 { - if x != nil { - return x.Timeout - } - return 0 -} - -func (x *HealthCheck) GetRetries() uint32 { - if x != nil { - return x.Retries - } - return 0 -} - -// Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. -type Service struct { - state protoimpl.MessageState `protogen:"open.v1"` - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Image string `protobuf:"bytes,2,opt,name=image,proto3" json:"image,omitempty"` - Platform Platform `protobuf:"varint,3,opt,name=platform,proto3,enum=io.defang.v1.Platform" json:"platform,omitempty"` - // Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. - Internal bool `protobuf:"varint,4,opt,name=internal,proto3" json:"internal,omitempty"` // deprecated: use networks - Deploy *Deploy `protobuf:"bytes,5,opt,name=deploy,proto3" json:"deploy,omitempty"` - Ports []*Port `protobuf:"bytes,6,rep,name=ports,proto3" json:"ports,omitempty"` - Environment map[string]string `protobuf:"bytes,7,rep,name=environment,proto3" json:"environment,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` - Build *Build `protobuf:"bytes,8,opt,name=build,proto3" json:"build,omitempty"` - Secrets []*Secret `protobuf:"bytes,9,rep,name=secrets,proto3" json:"secrets,omitempty"` // FIXME: these are actually env vars - Healthcheck *HealthCheck `protobuf:"bytes,10,opt,name=healthcheck,proto3" json:"healthcheck,omitempty"` - Command []string `protobuf:"bytes,11,rep,name=command,proto3" json:"command,omitempty"` - Domainname string `protobuf:"bytes,12,opt,name=domainname,proto3" json:"domainname,omitempty"` - Init bool `protobuf:"varint,13,opt,name=init,proto3" json:"init,omitempty"` - DnsRole string `protobuf:"bytes,14,opt,name=dns_role,json=dnsRole,proto3" json:"dns_role,omitempty"` // x-defang-dns-role: role arn used to access route53 to - // create dns records - StaticFiles *StaticFiles `protobuf:"bytes,15,opt,name=static_files,json=staticFiles,proto3" json:"static_files,omitempty"` // x-defang-static-files: use a managed CDN - Networks Network `protobuf:"varint,16,opt,name=networks,proto3,enum=io.defang.v1.Network" json:"networks,omitempty"` // currently only 1 network is supported - Aliases []string `protobuf:"bytes,17,rep,name=aliases,proto3" json:"aliases,omitempty"` - Redis *Redis `protobuf:"bytes,18,opt,name=redis,proto3" json:"redis,omitempty"` // x-defang-redis: use a managed redis - Project string `protobuf:"bytes,20,opt,name=project,proto3" json:"project,omitempty"` // defaults to tenant ID - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *Service) Reset() { - *x = Service{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[58] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *Service) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Service) ProtoMessage() {} - -func (x *Service) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[58] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Service.ProtoReflect.Descriptor instead. -func (*Service) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{58} -} - -func (x *Service) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *Service) GetImage() string { - if x != nil { - return x.Image - } - return "" -} - -func (x *Service) GetPlatform() Platform { - if x != nil { - return x.Platform - } - return Platform_LINUX_AMD64 -} - -// Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. -func (x *Service) GetInternal() bool { - if x != nil { - return x.Internal - } - return false -} - -func (x *Service) GetDeploy() *Deploy { - if x != nil { - return x.Deploy - } - return nil -} - -func (x *Service) GetPorts() []*Port { - if x != nil { - return x.Ports - } - return nil -} - -func (x *Service) GetEnvironment() map[string]string { - if x != nil { - return x.Environment - } - return nil -} - -func (x *Service) GetBuild() *Build { - if x != nil { - return x.Build - } - return nil -} - -func (x *Service) GetSecrets() []*Secret { - if x != nil { - return x.Secrets - } - return nil -} - -func (x *Service) GetHealthcheck() *HealthCheck { - if x != nil { - return x.Healthcheck - } - return nil -} - -func (x *Service) GetCommand() []string { - if x != nil { - return x.Command - } - return nil -} - -func (x *Service) GetDomainname() string { - if x != nil { - return x.Domainname - } - return "" -} - -func (x *Service) GetInit() bool { - if x != nil { - return x.Init - } - return false -} - -func (x *Service) GetDnsRole() string { - if x != nil { - return x.DnsRole - } - return "" -} - -func (x *Service) GetStaticFiles() *StaticFiles { - if x != nil { - return x.StaticFiles - } - return nil -} - -func (x *Service) GetNetworks() Network { - if x != nil { - return x.Networks - } - return Network_UNSPECIFIED -} - -func (x *Service) GetAliases() []string { - if x != nil { - return x.Aliases - } - return nil -} - -func (x *Service) GetRedis() *Redis { - if x != nil { - return x.Redis - } - return nil -} - -func (x *Service) GetProject() string { - if x != nil { - return x.Project - } - return "" -} - -// Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. -type StaticFiles struct { - state protoimpl.MessageState `protogen:"open.v1"` - Folder string `protobuf:"bytes,1,opt,name=folder,proto3" json:"folder,omitempty"` - Redirects []string `protobuf:"bytes,2,rep,name=redirects,proto3" json:"redirects,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *StaticFiles) Reset() { - *x = StaticFiles{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[59] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *StaticFiles) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*StaticFiles) ProtoMessage() {} - -func (x *StaticFiles) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[59] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use StaticFiles.ProtoReflect.Descriptor instead. -func (*StaticFiles) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{59} -} - -func (x *StaticFiles) GetFolder() string { - if x != nil { - return x.Folder - } - return "" -} - -func (x *StaticFiles) GetRedirects() []string { - if x != nil { - return x.Redirects - } - return nil -} - -// Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. -type Redis struct { - state protoimpl.MessageState `protogen:"open.v1"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *Redis) Reset() { - *x = Redis{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[60] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *Redis) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Redis) ProtoMessage() {} - -func (x *Redis) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[60] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Redis.ProtoReflect.Descriptor instead. -func (*Redis) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{60} -} - -// TODO: internal message; move to a separate proto file; was Event -type DeployEvent struct { - state protoimpl.MessageState `protogen:"open.v1"` - Mode DeploymentMode `protobuf:"varint,1,opt,name=mode,proto3,enum=io.defang.v1.DeploymentMode" json:"mode,omitempty"` - Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` // required - Source string `protobuf:"bytes,3,opt,name=source,proto3" json:"source,omitempty"` - Id string `protobuf:"bytes,4,opt,name=id,proto3" json:"id,omitempty"` // etag - Datacontenttype string `protobuf:"bytes,5,opt,name=datacontenttype,proto3" json:"datacontenttype,omitempty"` - Dataschema string `protobuf:"bytes,6,opt,name=dataschema,proto3" json:"dataschema,omitempty"` - Subject string `protobuf:"bytes,7,opt,name=subject,proto3" json:"subject,omitempty"` // tenant|stack; also used as SQS group ID - Time *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=time,proto3" json:"time,omitempty"` - Data []byte `protobuf:"bytes,9,opt,name=data,proto3" json:"data,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *DeployEvent) Reset() { - *x = DeployEvent{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[61] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *DeployEvent) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DeployEvent) ProtoMessage() {} - -func (x *DeployEvent) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[61] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DeployEvent.ProtoReflect.Descriptor instead. -func (*DeployEvent) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{61} -} - -func (x *DeployEvent) GetMode() DeploymentMode { - if x != nil { - return x.Mode - } - return DeploymentMode_MODE_UNSPECIFIED -} - -func (x *DeployEvent) GetType() string { - if x != nil { - return x.Type - } - return "" -} - -func (x *DeployEvent) GetSource() string { - if x != nil { - return x.Source - } - return "" -} - -func (x *DeployEvent) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *DeployEvent) GetDatacontenttype() string { - if x != nil { - return x.Datacontenttype - } - return "" -} - -func (x *DeployEvent) GetDataschema() string { - if x != nil { - return x.Dataschema - } - return "" -} - -func (x *DeployEvent) GetSubject() string { - if x != nil { - return x.Subject - } - return "" -} - -func (x *DeployEvent) GetTime() *timestamppb.Timestamp { - if x != nil { - return x.Time - } - return nil -} - -func (x *DeployEvent) GetData() []byte { - if x != nil { - return x.Data - } - return nil -} - -// Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. -type Event struct { - state protoimpl.MessageState `protogen:"open.v1"` - Specversion string `protobuf:"bytes,1,opt,name=specversion,proto3" json:"specversion,omitempty"` // required (but we don't care) - Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` // required - Source string `protobuf:"bytes,3,opt,name=source,proto3" json:"source,omitempty"` // required - Id string `protobuf:"bytes,4,opt,name=id,proto3" json:"id,omitempty"` // required - Datacontenttype string `protobuf:"bytes,5,opt,name=datacontenttype,proto3" json:"datacontenttype,omitempty"` - Dataschema string `protobuf:"bytes,6,opt,name=dataschema,proto3" json:"dataschema,omitempty"` - Subject string `protobuf:"bytes,7,opt,name=subject,proto3" json:"subject,omitempty"` - Time *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=time,proto3" json:"time,omitempty"` - Data []byte `protobuf:"bytes,9,opt,name=data,proto3" json:"data,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *Event) Reset() { - *x = Event{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[62] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *Event) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Event) ProtoMessage() {} - -func (x *Event) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[62] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Event.ProtoReflect.Descriptor instead. -func (*Event) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{62} -} - -func (x *Event) GetSpecversion() string { - if x != nil { - return x.Specversion - } - return "" -} - -func (x *Event) GetType() string { - if x != nil { - return x.Type - } - return "" -} - -func (x *Event) GetSource() string { - if x != nil { - return x.Source - } - return "" -} - -func (x *Event) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *Event) GetDatacontenttype() string { - if x != nil { - return x.Datacontenttype - } - return "" -} - -func (x *Event) GetDataschema() string { - if x != nil { - return x.Dataschema - } - return "" -} - -func (x *Event) GetSubject() string { - if x != nil { - return x.Subject - } - return "" -} - -func (x *Event) GetTime() *timestamppb.Timestamp { - if x != nil { - return x.Time + return x.Time } return nil } @@ -4744,7 +3675,7 @@ type PublishRequest struct { func (x *PublishRequest) Reset() { *x = PublishRequest{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[63] + mi := &file_io_defang_v1_fabric_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4756,7 +3687,7 @@ func (x *PublishRequest) String() string { func (*PublishRequest) ProtoMessage() {} func (x *PublishRequest) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[63] + mi := &file_io_defang_v1_fabric_proto_msgTypes[51] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4769,7 +3700,7 @@ func (x *PublishRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PublishRequest.ProtoReflect.Descriptor instead. func (*PublishRequest) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{63} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{51} } func (x *PublishRequest) GetEvent() *Event { @@ -4790,7 +3721,7 @@ type SubscribeRequest struct { func (x *SubscribeRequest) Reset() { *x = SubscribeRequest{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[64] + mi := &file_io_defang_v1_fabric_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4802,7 +3733,7 @@ func (x *SubscribeRequest) String() string { func (*SubscribeRequest) ProtoMessage() {} func (x *SubscribeRequest) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[64] + mi := &file_io_defang_v1_fabric_proto_msgTypes[52] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4815,7 +3746,7 @@ func (x *SubscribeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscribeRequest.ProtoReflect.Descriptor instead. func (*SubscribeRequest) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{64} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{52} } func (x *SubscribeRequest) GetServices() []string { @@ -4852,7 +3783,7 @@ type SubscribeResponse struct { func (x *SubscribeResponse) Reset() { *x = SubscribeResponse{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[65] + mi := &file_io_defang_v1_fabric_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4864,7 +3795,7 @@ func (x *SubscribeResponse) String() string { func (*SubscribeResponse) ProtoMessage() {} func (x *SubscribeResponse) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[65] + mi := &file_io_defang_v1_fabric_proto_msgTypes[53] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4877,7 +3808,7 @@ func (x *SubscribeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscribeResponse.ProtoReflect.Descriptor instead. func (*SubscribeResponse) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{65} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{53} } // Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. @@ -4918,7 +3849,7 @@ type GetServicesRequest struct { func (x *GetServicesRequest) Reset() { *x = GetServicesRequest{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[66] + mi := &file_io_defang_v1_fabric_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4930,7 +3861,7 @@ func (x *GetServicesRequest) String() string { func (*GetServicesRequest) ProtoMessage() {} func (x *GetServicesRequest) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[66] + mi := &file_io_defang_v1_fabric_proto_msgTypes[54] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4943,7 +3874,7 @@ func (x *GetServicesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetServicesRequest.ProtoReflect.Descriptor instead. func (*GetServicesRequest) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{66} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{54} } func (x *GetServicesRequest) GetProject() string { @@ -4963,7 +3894,7 @@ type DelegateSubdomainZoneRequest struct { func (x *DelegateSubdomainZoneRequest) Reset() { *x = DelegateSubdomainZoneRequest{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[67] + mi := &file_io_defang_v1_fabric_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4975,7 +3906,7 @@ func (x *DelegateSubdomainZoneRequest) String() string { func (*DelegateSubdomainZoneRequest) ProtoMessage() {} func (x *DelegateSubdomainZoneRequest) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[67] + mi := &file_io_defang_v1_fabric_proto_msgTypes[55] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4988,7 +3919,7 @@ func (x *DelegateSubdomainZoneRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DelegateSubdomainZoneRequest.ProtoReflect.Descriptor instead. func (*DelegateSubdomainZoneRequest) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{67} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{55} } func (x *DelegateSubdomainZoneRequest) GetNameServerRecords() []string { @@ -5014,7 +3945,7 @@ type DelegateSubdomainZoneResponse struct { func (x *DelegateSubdomainZoneResponse) Reset() { *x = DelegateSubdomainZoneResponse{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[68] + mi := &file_io_defang_v1_fabric_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5026,7 +3957,7 @@ func (x *DelegateSubdomainZoneResponse) String() string { func (*DelegateSubdomainZoneResponse) ProtoMessage() {} func (x *DelegateSubdomainZoneResponse) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[68] + mi := &file_io_defang_v1_fabric_proto_msgTypes[56] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5039,7 +3970,7 @@ func (x *DelegateSubdomainZoneResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DelegateSubdomainZoneResponse.ProtoReflect.Descriptor instead. func (*DelegateSubdomainZoneResponse) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{68} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{56} } func (x *DelegateSubdomainZoneResponse) GetZone() string { @@ -5058,7 +3989,7 @@ type DeleteSubdomainZoneRequest struct { func (x *DeleteSubdomainZoneRequest) Reset() { *x = DeleteSubdomainZoneRequest{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[69] + mi := &file_io_defang_v1_fabric_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5070,7 +4001,7 @@ func (x *DeleteSubdomainZoneRequest) String() string { func (*DeleteSubdomainZoneRequest) ProtoMessage() {} func (x *DeleteSubdomainZoneRequest) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[69] + mi := &file_io_defang_v1_fabric_proto_msgTypes[57] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5083,7 +4014,7 @@ func (x *DeleteSubdomainZoneRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteSubdomainZoneRequest.ProtoReflect.Descriptor instead. func (*DeleteSubdomainZoneRequest) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{69} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{57} } func (x *DeleteSubdomainZoneRequest) GetProject() string { @@ -5102,7 +4033,7 @@ type GetDelegateSubdomainZoneRequest struct { func (x *GetDelegateSubdomainZoneRequest) Reset() { *x = GetDelegateSubdomainZoneRequest{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[70] + mi := &file_io_defang_v1_fabric_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5114,7 +4045,7 @@ func (x *GetDelegateSubdomainZoneRequest) String() string { func (*GetDelegateSubdomainZoneRequest) ProtoMessage() {} func (x *GetDelegateSubdomainZoneRequest) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[70] + mi := &file_io_defang_v1_fabric_proto_msgTypes[58] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5127,7 +4058,7 @@ func (x *GetDelegateSubdomainZoneRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetDelegateSubdomainZoneRequest.ProtoReflect.Descriptor instead. func (*GetDelegateSubdomainZoneRequest) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{70} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{58} } func (x *GetDelegateSubdomainZoneRequest) GetProject() string { @@ -5147,7 +4078,7 @@ type SetOptionsRequest struct { func (x *SetOptionsRequest) Reset() { *x = SetOptionsRequest{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[71] + mi := &file_io_defang_v1_fabric_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5159,7 +4090,7 @@ func (x *SetOptionsRequest) String() string { func (*SetOptionsRequest) ProtoMessage() {} func (x *SetOptionsRequest) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[71] + mi := &file_io_defang_v1_fabric_proto_msgTypes[59] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5172,7 +4103,7 @@ func (x *SetOptionsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetOptionsRequest.ProtoReflect.Descriptor instead. func (*SetOptionsRequest) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{71} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{59} } func (x *SetOptionsRequest) GetTrainingOptOut() bool { @@ -5203,7 +4134,7 @@ type WhoAmIResponse struct { func (x *WhoAmIResponse) Reset() { *x = WhoAmIResponse{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[72] + mi := &file_io_defang_v1_fabric_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5215,7 +4146,7 @@ func (x *WhoAmIResponse) String() string { func (*WhoAmIResponse) ProtoMessage() {} func (x *WhoAmIResponse) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[72] + mi := &file_io_defang_v1_fabric_proto_msgTypes[60] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5228,7 +4159,7 @@ func (x *WhoAmIResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use WhoAmIResponse.ProtoReflect.Descriptor instead. func (*WhoAmIResponse) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{72} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{60} } func (x *WhoAmIResponse) GetTenant() string { @@ -5284,7 +4215,7 @@ type EstimateRequest struct { func (x *EstimateRequest) Reset() { *x = EstimateRequest{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[73] + mi := &file_io_defang_v1_fabric_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5296,7 +4227,7 @@ func (x *EstimateRequest) String() string { func (*EstimateRequest) ProtoMessage() {} func (x *EstimateRequest) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[73] + mi := &file_io_defang_v1_fabric_proto_msgTypes[61] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5309,7 +4240,7 @@ func (x *EstimateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use EstimateRequest.ProtoReflect.Descriptor instead. func (*EstimateRequest) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{73} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{61} } func (x *EstimateRequest) GetProvider() Provider { @@ -5346,7 +4277,7 @@ type EstimateLineItem struct { func (x *EstimateLineItem) Reset() { *x = EstimateLineItem{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[74] + mi := &file_io_defang_v1_fabric_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5358,7 +4289,7 @@ func (x *EstimateLineItem) String() string { func (*EstimateLineItem) ProtoMessage() {} func (x *EstimateLineItem) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[74] + mi := &file_io_defang_v1_fabric_proto_msgTypes[62] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5371,7 +4302,7 @@ func (x *EstimateLineItem) ProtoReflect() protoreflect.Message { // Deprecated: Use EstimateLineItem.ProtoReflect.Descriptor instead. func (*EstimateLineItem) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{74} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{62} } func (x *EstimateLineItem) GetDescription() string { @@ -5421,7 +4352,7 @@ type EstimateResponse struct { func (x *EstimateResponse) Reset() { *x = EstimateResponse{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[75] + mi := &file_io_defang_v1_fabric_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5433,7 +4364,7 @@ func (x *EstimateResponse) String() string { func (*EstimateResponse) ProtoMessage() {} func (x *EstimateResponse) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[75] + mi := &file_io_defang_v1_fabric_proto_msgTypes[63] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5446,7 +4377,7 @@ func (x *EstimateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use EstimateResponse.ProtoReflect.Descriptor instead. func (*EstimateResponse) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{75} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{63} } func (x *EstimateResponse) GetProvider() Provider { @@ -5491,7 +4422,7 @@ type PreviewRequest struct { func (x *PreviewRequest) Reset() { *x = PreviewRequest{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[76] + mi := &file_io_defang_v1_fabric_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5503,7 +4434,7 @@ func (x *PreviewRequest) String() string { func (*PreviewRequest) ProtoMessage() {} func (x *PreviewRequest) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[76] + mi := &file_io_defang_v1_fabric_proto_msgTypes[64] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5516,7 +4447,7 @@ func (x *PreviewRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PreviewRequest.ProtoReflect.Descriptor instead. func (*PreviewRequest) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{76} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{64} } func (x *PreviewRequest) GetProvider() Provider { @@ -5570,7 +4501,7 @@ type PreviewResponse struct { func (x *PreviewResponse) Reset() { *x = PreviewResponse{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[77] + mi := &file_io_defang_v1_fabric_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5582,7 +4513,7 @@ func (x *PreviewResponse) String() string { func (*PreviewResponse) ProtoMessage() {} func (x *PreviewResponse) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[77] + mi := &file_io_defang_v1_fabric_proto_msgTypes[65] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5595,7 +4526,7 @@ func (x *PreviewResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PreviewResponse.ProtoReflect.Descriptor instead. func (*PreviewResponse) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{77} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{65} } func (x *PreviewResponse) GetEtag() string { @@ -5712,857 +4643,717 @@ var file_io_defang_v1_fabric_proto_rawDesc = []byte{ 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x75, 0x6c, 0x75, 0x6d, 0x69, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x75, 0x6c, 0x75, 0x6d, 0x69, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x22, 0xa3, 0x02, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x22, 0xf2, 0x01, 0x0a, 0x0d, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x35, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x07, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x12, 0x30, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, - 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x6f, 0x64, 0x65, - 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, + 0x1c, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x02, 0x18, 0x01, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x30, 0x0a, + 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x69, 0x6f, + 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x65, 0x6c, + 0x65, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x6d, 0x61, + 0x69, 0x6e, 0x12, 0x2a, 0x0a, 0x11, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, + 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1c, + 0x0a, 0x07, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x42, + 0x02, 0x18, 0x01, 0x52, 0x07, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x4a, 0x04, 0x08, 0x01, + 0x10, 0x02, 0x22, 0x5b, 0x0a, 0x0e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, + 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x65, + 0x74, 0x61, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x22, + 0x68, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x64, 0x6f, 0x6d, - 0x61, 0x69, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x64, 0x65, 0x6c, 0x65, 0x67, - 0x61, 0x74, 0x65, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x2a, 0x0a, 0x11, 0x64, 0x65, 0x6c, - 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x07, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x07, 0x70, 0x72, 0x65, 0x76, - 0x69, 0x65, 0x77, 0x22, 0x5b, 0x0a, 0x0e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, - 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, - 0x65, 0x74, 0x61, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, - 0x22, 0x68, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x64, 0x6f, - 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x64, 0x65, 0x6c, 0x65, - 0x67, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x24, 0x0a, 0x0e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x65, 0x74, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, - 0x22, 0xac, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x6f, - 0x6d, 0x70, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x72, 0x6f, 0x6d, 0x70, - 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x1b, 0x0a, - 0x09, 0x61, 0x67, 0x72, 0x65, 0x65, 0x5f, 0x74, 0x6f, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x08, 0x61, 0x67, 0x72, 0x65, 0x65, 0x54, 0x6f, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x74, 0x72, - 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6f, 0x70, 0x74, 0x5f, 0x6f, 0x75, 0x74, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x4f, 0x70, - 0x74, 0x4f, 0x75, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x49, 0x64, 0x22, - 0x34, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x41, 0x0a, 0x15, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, - 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, - 0x0a, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6c, - 0x65, 0x52, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x22, 0x2b, 0x0a, 0x15, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0x2b, 0x0a, 0x15, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, - 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, - 0x69, 0x64, 0x22, 0x44, 0x0a, 0x10, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x52, 0x4c, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x18, + 0x61, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x64, 0x65, 0x6c, 0x65, 0x67, + 0x61, 0x74, 0x65, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x24, 0x0a, 0x0e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x65, + 0x74, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x22, + 0xac, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x6f, 0x6d, + 0x70, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x72, 0x6f, 0x6d, 0x70, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x1b, 0x0a, 0x09, + 0x61, 0x67, 0x72, 0x65, 0x65, 0x5f, 0x74, 0x6f, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x08, 0x61, 0x67, 0x72, 0x65, 0x65, 0x54, 0x6f, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x74, 0x72, 0x61, + 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6f, 0x70, 0x74, 0x5f, 0x6f, 0x75, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0e, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x4f, 0x70, 0x74, + 0x4f, 0x75, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x49, 0x64, 0x22, 0x34, + 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x41, 0x0a, 0x15, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, + 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, + 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x69, + 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6c, 0x65, + 0x52, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x22, 0x2b, 0x0a, 0x15, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x75, 0x75, 0x69, 0x64, 0x22, 0x2b, 0x0a, 0x15, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, + 0x64, 0x22, 0x44, 0x0a, 0x10, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x52, 0x4c, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, + 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x25, 0x0a, 0x11, 0x55, 0x70, 0x6c, 0x6f, 0x61, + 0x64, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, + 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, 0x9c, + 0x05, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2f, + 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x18, 0x0a, + 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x61, 0x74, 0x5f, 0x69, 0x70, 0x73, 0x18, 0x06, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x61, 0x74, 0x49, 0x70, 0x73, 0x12, 0x15, 0x0a, 0x06, + 0x6c, 0x62, 0x5f, 0x69, 0x70, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x62, + 0x49, 0x70, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x66, + 0x71, 0x64, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x46, 0x71, 0x64, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, + 0x5f, 0x66, 0x71, 0x64, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x46, 0x71, 0x64, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x17, 0x0a, + 0x07, 0x7a, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x7a, 0x6f, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0d, 0x75, 0x73, 0x65, 0x5f, 0x61, 0x63, + 0x6d, 0x65, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x75, + 0x73, 0x65, 0x41, 0x63, 0x6d, 0x65, 0x43, 0x65, 0x72, 0x74, 0x12, 0x30, 0x0a, 0x05, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x69, 0x6f, 0x2e, 0x64, + 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1e, 0x0a, 0x0a, + 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0b, + 0x6c, 0x62, 0x5f, 0x64, 0x6e, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x6c, 0x62, 0x44, 0x6e, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x12, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, + 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x4a, 0x04, 0x08, 0x0e, 0x10, 0x0f, 0x22, 0x3d, 0x0a, + 0x07, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x25, 0x0a, 0x11, 0x55, 0x70, 0x6c, 0x6f, - 0x61, 0x64, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, - 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, - 0xe6, 0x04, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x2f, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x15, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x18, - 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x16, 0x0a, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x61, 0x74, 0x5f, 0x69, 0x70, 0x73, 0x18, - 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x61, 0x74, 0x49, 0x70, 0x73, 0x12, 0x15, 0x0a, - 0x06, 0x6c, 0x62, 0x5f, 0x69, 0x70, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6c, - 0x62, 0x49, 0x70, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, - 0x66, 0x71, 0x64, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x76, - 0x61, 0x74, 0x65, 0x46, 0x71, 0x64, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x5f, 0x66, 0x71, 0x64, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x75, - 0x62, 0x6c, 0x69, 0x63, 0x46, 0x71, 0x64, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, - 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x17, - 0x0a, 0x07, 0x7a, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x7a, 0x6f, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0d, 0x75, 0x73, 0x65, 0x5f, 0x61, - 0x63, 0x6d, 0x65, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, - 0x75, 0x73, 0x65, 0x41, 0x63, 0x6d, 0x65, 0x43, 0x65, 0x72, 0x74, 0x12, 0x30, 0x0a, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x69, 0x6f, 0x2e, - 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1e, 0x0a, - 0x0a, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, - 0x0b, 0x6c, 0x62, 0x5f, 0x64, 0x6e, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x11, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x6c, 0x62, 0x44, 0x6e, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, - 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x12, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x53, 0x63, 0x61, 0x6c, 0x69, - 0x6e, 0x67, 0x4a, 0x04, 0x08, 0x0e, 0x10, 0x0f, 0x22, 0x3d, 0x0a, 0x07, 0x53, 0x65, 0x63, 0x72, - 0x65, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x3a, 0x02, 0x18, 0x01, 0x22, 0x55, 0x0a, 0x0b, 0x53, 0x65, 0x63, 0x72, 0x65, - 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x3a, 0x02, 0x18, 0x01, 0x22, 0x7a, - 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x2c, 0x0a, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x69, 0x6f, 0x2e, - 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x39, 0x0a, 0x09, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x10, 0x50, 0x75, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x2c, - 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x69, - 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x46, 0x0a, 0x11, - 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x31, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x3a, 0x02, 0x18, 0x01, 0x22, 0x55, 0x0a, 0x0b, + 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x3a, + 0x02, 0x18, 0x01, 0x22, 0x7a, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x18, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x39, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x10, 0x50, + 0x75, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x18, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x46, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, + 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4b, 0x65, 0x79, + 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x22, 0x44, 0x0a, 0x12, 0x47, 0x65, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x2e, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x14, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x22, + 0x49, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, + 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4b, 0x65, + 0x79, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x22, 0x2e, 0x0a, 0x12, 0x4c, 0x69, + 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x48, 0x0a, 0x13, 0x4c, 0x69, + 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x31, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4b, 0x65, 0x79, 0x52, 0x07, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x73, 0x22, 0x44, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x07, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6f, - 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x22, 0x49, 0x0a, 0x14, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x31, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4b, 0x65, 0x79, 0x52, 0x07, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x73, 0x22, 0x2e, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x48, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x07, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x4b, 0x65, 0x79, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x22, - 0xd1, 0x02, 0x0a, 0x0a, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, - 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x2b, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x2e, 0x0a, 0x13, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, - 0x36, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x1e, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, - 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, - 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, - 0x32, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, - 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x22, 0x50, 0x0a, 0x14, 0x50, 0x75, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x64, - 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x18, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, - 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x7a, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, - 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x30, 0x0a, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, - 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x22, 0x55, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x0b, - 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, - 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x64, 0x65, 0x70, - 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xd4, 0x01, 0x0a, 0x0c, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x65, 0x6e, - 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x6e, 0x61, 0x6e, - 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x69, 0x6e, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x49, - 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x61, 0x6e, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x61, 0x6e, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, - 0x66, 0x72, 0x65, 0x73, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, - 0x57, 0x0a, 0x0d, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x5f, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x66, 0x72, - 0x65, 0x73, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x22, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x5f, 0x0a, 0x07, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x61, 0x62, 0x72, 0x69, - 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x61, 0x62, 0x72, 0x69, 0x63, 0x12, - 0x17, 0x0a, 0x07, 0x63, 0x6c, 0x69, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x63, 0x6c, 0x69, 0x4d, 0x69, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x6c, 0x75, - 0x6d, 0x69, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x75, - 0x6c, 0x75, 0x6d, 0x69, 0x4d, 0x69, 0x6e, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0xcc, 0x02, - 0x0a, 0x0b, 0x54, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, - 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x05, 0x73, 0x69, 0x6e, - 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x05, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x65, - 0x74, 0x61, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, - 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x6f, 0x67, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x6c, 0x6f, 0x67, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x30, - 0x0a, 0x05, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x66, 0x69, 0x67, 0x73, 0x22, 0xd1, 0x02, 0x0a, 0x0a, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x2b, 0x0a, + 0x0f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x2e, 0x0a, 0x13, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x05, 0x75, 0x6e, 0x74, 0x69, 0x6c, - 0x22, 0x5a, 0x0a, 0x07, 0x4c, 0x6f, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x14, 0x4c, - 0x4f, 0x47, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, - 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4c, 0x4f, 0x47, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x43, 0x44, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x4c, 0x4f, 0x47, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x4c, 0x4f, - 0x47, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x55, 0x4e, 0x10, 0x04, 0x22, 0xb8, 0x01, 0x0a, - 0x08, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 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, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x16, 0x0a, - 0x06, 0x73, 0x74, 0x64, 0x65, 0x72, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, - 0x74, 0x64, 0x65, 0x72, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, - 0x74, 0x61, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x22, 0x88, 0x01, 0x0a, 0x0c, 0x54, 0x61, 0x69, 0x6c, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, - 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x69, 0x6f, 0x2e, 0x64, - 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x04, 0x20, 0x01, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x12, 0x36, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, + 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, + 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, + 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x08, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0x50, 0x0a, 0x14, 0x50, 0x75, 0x74, 0x44, + 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x38, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, + 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x7a, 0x0a, 0x16, 0x4c, 0x69, + 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x30, + 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x69, + 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x55, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, + 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x3a, 0x0a, 0x0b, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, + 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x0b, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xd4, 0x01, + 0x0a, 0x0c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, + 0x0a, 0x06, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x63, + 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x75, 0x74, 0x68, 0x43, + 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x73, 0x73, + 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x73, + 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, + 0x65, 0x73, 0x5f, 0x69, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x65, 0x78, 0x70, + 0x69, 0x72, 0x65, 0x73, 0x49, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x61, 0x6e, 0x6f, 0x6e, 0x5f, 0x69, + 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6e, 0x6f, 0x6e, 0x49, 0x64, 0x12, + 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x57, 0x0a, 0x0d, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x66, 0x72, + 0x65, 0x73, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x22, 0x0a, + 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x5f, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, + 0x66, 0x61, 0x62, 0x72, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x61, + 0x62, 0x72, 0x69, 0x63, 0x12, 0x17, 0x0a, 0x07, 0x63, 0x6c, 0x69, 0x5f, 0x6d, 0x69, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x6c, 0x69, 0x4d, 0x69, 0x6e, 0x12, 0x1d, 0x0a, + 0x0a, 0x70, 0x75, 0x6c, 0x75, 0x6d, 0x69, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x70, 0x75, 0x6c, 0x75, 0x6d, 0x69, 0x4d, 0x69, 0x6e, 0x4a, 0x04, 0x08, 0x02, + 0x10, 0x03, 0x22, 0xcc, 0x02, 0x0a, 0x0b, 0x54, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x30, + 0x0a, 0x05, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x05, 0x73, 0x69, 0x6e, 0x63, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x65, 0x74, 0x61, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x19, + 0x0a, 0x08, 0x6c, 0x6f, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x07, 0x6c, 0x6f, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x12, 0x30, 0x0a, 0x05, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x05, + 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x22, 0x5a, 0x0a, 0x07, 0x4c, 0x6f, 0x67, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x18, 0x0a, 0x14, 0x4c, 0x4f, 0x47, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, + 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4c, 0x4f, + 0x47, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x44, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x4c, + 0x4f, 0x47, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x10, 0x02, 0x12, + 0x10, 0x0a, 0x0c, 0x4c, 0x4f, 0x47, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x55, 0x4e, 0x10, + 0x04, 0x22, 0xb8, 0x01, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 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, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x64, 0x65, 0x72, 0x72, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x06, 0x73, 0x74, 0x64, 0x65, 0x72, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x4a, 0x04, 0x08, 0x01, - 0x10, 0x02, 0x22, 0xa1, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, - 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x65, - 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x65, 0x78, 0x70, - 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x22, 0xfd, 0x02, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6f, 0x2e, - 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, - 0x17, 0x0a, 0x07, 0x61, 0x6c, 0x62, 0x5f, 0x61, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x61, 0x6c, 0x62, 0x41, 0x72, 0x6e, 0x12, 0x1c, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x07, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, - 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x64, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x30, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, - 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, - 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, - 0x65, 0x12, 0x32, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x08, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x17, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, - 0x0f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x22, 0x3d, 0x0a, 0x09, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x3a, 0x02, 0x18, 0x01, 0x22, 0x3a, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x22, 0x88, 0x01, 0x0a, + 0x0c, 0x54, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, + 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, + 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, + 0x18, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, + 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x12, 0x0a, + 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, + 0x74, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x22, 0xa1, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x35, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x22, 0xfd, 0x02, 0x0a, 0x0d, + 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x35, 0x0a, + 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x61, 0x6c, 0x62, 0x5f, 0x61, 0x72, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6c, 0x62, 0x41, 0x72, 0x6e, 0x12, 0x1c, 0x0a, + 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, + 0x18, 0x01, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x64, 0x5f, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x64, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, + 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x6f, 0x64, 0x65, + 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x32, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, + 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x17, 0x70, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x5f, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x22, 0x3a, 0x0a, 0x0a, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x91, 0x01, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x02, 0x18, 0x01, 0x4a, + 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x4a, 0x04, 0x08, 0x04, 0x10, + 0x05, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x4a, 0x04, 0x08, + 0x07, 0x10, 0x08, 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, 0x4a, 0x04, 0x08, 0x09, 0x10, 0x0a, 0x4a, + 0x04, 0x08, 0x0a, 0x10, 0x0b, 0x4a, 0x04, 0x08, 0x0b, 0x10, 0x0c, 0x4a, 0x04, 0x08, 0x0c, 0x10, + 0x0d, 0x4a, 0x04, 0x08, 0x0d, 0x10, 0x0e, 0x4a, 0x04, 0x08, 0x0e, 0x10, 0x0f, 0x4a, 0x04, 0x08, + 0x0f, 0x10, 0x10, 0x4a, 0x04, 0x08, 0x10, 0x10, 0x11, 0x4a, 0x04, 0x08, 0x11, 0x10, 0x12, 0x4a, + 0x04, 0x08, 0x12, 0x10, 0x13, 0x4a, 0x04, 0x08, 0x14, 0x10, 0x15, 0x22, 0x91, 0x02, 0x0a, 0x05, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x70, 0x65, 0x63, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x70, 0x65, 0x63, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x61, 0x74, 0x61, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x61, + 0x74, 0x61, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1e, 0x0a, + 0x0a, 0x64, 0x61, 0x74, 0x61, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x18, 0x0a, + 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x02, 0x18, 0x01, 0x22, + 0x3b, 0x0a, 0x0e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x29, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x5c, 0x0a, 0x10, + 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, + 0x65, 0x74, 0x61, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, + 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0xaa, 0x01, 0x0a, 0x11, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x37, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x02, 0x18, 0x01, + 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x30, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x2e, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, + 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x68, 0x0a, 0x1c, 0x44, 0x65, 0x6c, 0x65, 0x67, + 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, 0x6e, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x6e, 0x61, 0x6d, 0x65, 0x5f, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x22, 0x5e, 0x0a, 0x06, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, - 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, - 0x16, 0x0a, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x02, 0x18, - 0x01, 0x22, 0x6a, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x06, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x70, 0x75, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x02, 0x52, 0x04, 0x63, 0x70, 0x75, 0x73, 0x12, 0x2e, 0x0a, 0x07, 0x64, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6f, 0x2e, - 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x52, 0x07, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x3a, 0x02, 0x18, 0x01, 0x22, 0x4b, 0x0a, - 0x09, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x3a, 0x0a, 0x0c, 0x72, 0x65, - 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x16, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x02, 0x18, 0x01, 0x22, 0x5f, 0x0a, 0x06, 0x44, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, - 0x12, 0x35, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, - 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x09, 0x72, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x3a, 0x02, 0x18, 0x01, 0x22, 0x7e, 0x0a, 0x04, 0x50, - 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x32, 0x0a, 0x08, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, - 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, - 0x26, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, - 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f, 0x64, - 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x3a, 0x02, 0x18, 0x01, 0x22, 0x24, 0x0a, 0x06, 0x53, - 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x3a, 0x02, 0x18, - 0x01, 0x22, 0xe4, 0x01, 0x0a, 0x05, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x63, - 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x66, - 0x69, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x6b, 0x65, - 0x72, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x31, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, - 0x76, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x41, 0x72, 0x67, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x68, 0x6d, 0x5f, - 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x07, 0x73, 0x68, 0x6d, 0x53, - 0x69, 0x7a, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x1a, 0x37, 0x0a, 0x09, 0x41, - 0x72, 0x67, 0x73, 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, 0x3a, 0x02, 0x18, 0x01, 0x22, 0x75, 0x0a, 0x0b, 0x48, 0x65, 0x61, 0x6c, - 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x73, 0x74, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, - 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, - 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x3a, 0x02, 0x18, 0x01, 0x22, - 0xbe, 0x06, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x32, 0x0a, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, - 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, - 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, - 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x1e, 0x0a, 0x08, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, - 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x12, 0x2c, 0x0a, 0x06, 0x64, 0x65, 0x70, - 0x6c, 0x6f, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6f, 0x2e, 0x64, - 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, - 0x06, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x12, 0x28, 0x0a, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, - 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, - 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x05, 0x70, 0x6f, 0x72, 0x74, - 0x73, 0x12, 0x48, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, - 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, - 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x29, 0x0a, 0x05, 0x62, - 0x75, 0x69, 0x6c, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6f, 0x2e, - 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, - 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x2e, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, - 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, - 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x07, 0x73, - 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x3b, 0x0a, 0x0b, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, - 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6f, - 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, - 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x0b, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x63, 0x68, - 0x65, 0x63, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x0b, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x1e, 0x0a, - 0x0a, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x69, 0x6e, 0x69, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x69, 0x6e, 0x69, - 0x74, 0x12, 0x19, 0x0a, 0x08, 0x64, 0x6e, 0x73, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x0e, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x6e, 0x73, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x3c, 0x0a, 0x0c, - 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0f, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, - 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x0b, 0x73, - 0x74, 0x61, 0x74, 0x69, 0x63, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x31, 0x0a, 0x08, 0x6e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x69, - 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x52, 0x08, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x12, 0x18, 0x0a, - 0x07, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, - 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x64, 0x69, 0x73, - 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, - 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x64, 0x69, 0x73, 0x52, 0x05, 0x72, 0x65, 0x64, - 0x69, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x14, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x1a, 0x3e, 0x0a, 0x10, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 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, 0x3a, 0x02, 0x18, 0x01, - 0x22, 0x47, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, - 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x64, 0x69, 0x72, - 0x65, 0x63, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x64, 0x69, - 0x72, 0x65, 0x63, 0x74, 0x73, 0x3a, 0x02, 0x18, 0x01, 0x22, 0x0b, 0x0a, 0x05, 0x52, 0x65, 0x64, - 0x69, 0x73, 0x3a, 0x02, 0x18, 0x01, 0x22, 0xa3, 0x02, 0x0a, 0x0b, 0x44, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, - 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x6f, - 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x61, 0x74, 0x61, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, - 0x61, 0x74, 0x61, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1e, - 0x0a, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x18, - 0x0a, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x91, 0x02, 0x0a, - 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x70, 0x65, 0x63, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x70, 0x65, - 0x63, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x61, 0x74, 0x61, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, - 0x61, 0x74, 0x61, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1e, - 0x0a, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x18, - 0x0a, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x02, 0x18, 0x01, - 0x22, 0x3b, 0x0a, 0x0e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x29, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, - 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x5c, 0x0a, - 0x10, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x12, 0x0a, - 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, - 0x67, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0xaa, 0x01, 0x0a, 0x11, - 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x37, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, - 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x02, 0x18, - 0x01, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x30, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, - 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x2e, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, - 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x68, 0x0a, 0x1c, 0x44, 0x65, 0x6c, 0x65, - 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, 0x6e, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x6e, 0x61, 0x6d, 0x65, - 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x22, 0x33, 0x0a, 0x1d, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, - 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x7a, 0x6f, 0x6e, 0x65, 0x22, 0x36, 0x0a, 0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x53, 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, - 0x3b, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, - 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x58, 0x0a, 0x11, - 0x53, 0x65, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x28, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6f, 0x70, - 0x74, 0x5f, 0x6f, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x74, 0x72, 0x61, - 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x4f, 0x70, 0x74, 0x4f, 0x75, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x49, 0x64, 0x22, 0xe7, 0x01, 0x0a, 0x0e, 0x57, 0x68, 0x6f, 0x41, 0x6d, - 0x49, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x65, 0x6e, - 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x6e, 0x61, 0x6e, - 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, - 0x64, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, - 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, - 0x49, 0x64, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x69, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x1e, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, - 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x65, 0x72, - 0x52, 0x04, 0x74, 0x69, 0x65, 0x72, 0x12, 0x28, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x69, - 0x6e, 0x67, 0x5f, 0x6f, 0x70, 0x74, 0x5f, 0x6f, 0x75, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0e, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x4f, 0x70, 0x74, 0x4f, 0x75, 0x74, - 0x22, 0x84, 0x01, 0x0a, 0x0f, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, - 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x08, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, - 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x75, 0x6c, 0x75, 0x6d, 0x69, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, - 0x65, 0x77, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x70, 0x75, 0x6c, 0x75, 0x6d, 0x69, - 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x22, 0xa6, 0x01, 0x0a, 0x10, 0x45, 0x73, 0x74, 0x69, - 0x6d, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6e, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x20, 0x0a, 0x0b, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, - 0x0a, 0x04, 0x75, 0x6e, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x6e, - 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x02, 0x52, 0x08, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x26, - 0x0a, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, - 0x52, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x22, 0xcd, 0x01, 0x0a, 0x10, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, - 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, - 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, - 0x6e, 0x12, 0x2e, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, - 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x08, 0x73, 0x75, 0x62, 0x74, 0x6f, 0x74, 0x61, - 0x6c, 0x12, 0x3d, 0x0a, 0x0a, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, - 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6e, - 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x09, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x73, - 0x22, 0xdf, 0x01, 0x0a, 0x0e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x52, 0x65, 0x71, 0x75, + 0x74, 0x22, 0x33, 0x0a, 0x1d, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, + 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x7a, 0x6f, 0x6e, 0x65, 0x22, 0x36, 0x0a, 0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x53, 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x3b, + 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, + 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x58, 0x0a, 0x11, 0x53, + 0x65, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x28, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6f, 0x70, 0x74, + 0x5f, 0x6f, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x74, 0x72, 0x61, 0x69, + 0x6e, 0x69, 0x6e, 0x67, 0x4f, 0x70, 0x74, 0x4f, 0x75, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x49, 0x64, 0x22, 0xe7, 0x01, 0x0a, 0x0e, 0x57, 0x68, 0x6f, 0x41, 0x6d, 0x49, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x65, 0x6e, 0x61, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, + 0x12, 0x2e, 0x0a, 0x13, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, + 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, + 0x64, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x69, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x1e, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x65, 0x72, 0x52, + 0x04, 0x74, 0x69, 0x65, 0x72, 0x12, 0x28, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, + 0x67, 0x5f, 0x6f, 0x70, 0x74, 0x5f, 0x6f, 0x75, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0e, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x4f, 0x70, 0x74, 0x4f, 0x75, 0x74, 0x22, + 0x84, 0x01, 0x0a, 0x0f, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, - 0x30, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, - 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, - 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x12, - 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, - 0x6d, 0x65, 0x22, 0x25, 0x0a, 0x0f, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x2a, 0x54, 0x0a, 0x08, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x14, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, - 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, - 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x46, 0x41, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x41, - 0x57, 0x53, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x49, 0x47, 0x49, 0x54, 0x41, 0x4c, 0x4f, - 0x43, 0x45, 0x41, 0x4e, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x47, 0x43, 0x50, 0x10, 0x04, 0x2a, - 0x54, 0x0a, 0x0e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x6f, 0x64, - 0x65, 0x12, 0x14, 0x0a, 0x10, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, - 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x44, 0x45, 0x56, 0x45, 0x4c, - 0x4f, 0x50, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x41, 0x47, - 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x50, 0x52, 0x4f, 0x44, 0x55, 0x43, 0x54, - 0x49, 0x4f, 0x4e, 0x10, 0x03, 0x2a, 0xa3, 0x02, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x4f, 0x54, 0x5f, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x42, 0x55, 0x49, - 0x4c, 0x44, 0x5f, 0x51, 0x55, 0x45, 0x55, 0x45, 0x44, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x42, - 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x49, 0x4e, - 0x47, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x50, 0x45, 0x4e, - 0x44, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, - 0x41, 0x43, 0x54, 0x49, 0x56, 0x41, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x11, 0x0a, 0x0d, - 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, - 0x12, 0x0a, 0x0e, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x49, 0x4e, - 0x47, 0x10, 0x06, 0x12, 0x11, 0x0a, 0x0d, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x51, 0x55, - 0x45, 0x55, 0x45, 0x44, 0x10, 0x07, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, - 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x08, 0x12, 0x18, - 0x0a, 0x14, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x43, 0x4f, 0x4d, - 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x09, 0x12, 0x15, 0x0a, 0x11, 0x44, 0x45, 0x50, 0x4c, - 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x0a, 0x12, - 0x10, 0x0a, 0x0c, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, - 0x0b, 0x12, 0x18, 0x0a, 0x14, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, - 0x53, 0x43, 0x41, 0x4c, 0x45, 0x44, 0x5f, 0x49, 0x4e, 0x10, 0x0c, 0x2a, 0x42, 0x0a, 0x0a, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x4f, 0x4e, - 0x46, 0x49, 0x47, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, - 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x53, 0x45, 0x4e, 0x53, 0x49, 0x54, 0x49, 0x56, 0x45, 0x10, 0x01, 0x2a, - 0x6a, 0x0a, 0x0e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x1f, 0x0a, 0x1b, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, - 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x17, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x48, 0x49, 0x53, 0x54, 0x4f, 0x52, 0x59, 0x10, 0x01, 0x12, - 0x1a, 0x0a, 0x16, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x02, 0x2a, 0x6b, 0x0a, 0x10, 0x44, - 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x21, 0x0a, 0x1d, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x41, 0x43, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, - 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, - 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x50, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, - 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x02, 0x2a, 0x3f, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x74, - 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x0f, 0x0a, 0x0b, 0x4c, 0x49, 0x4e, 0x55, 0x58, 0x5f, 0x41, 0x4d, - 0x44, 0x36, 0x34, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4c, 0x49, 0x4e, 0x55, 0x58, 0x5f, 0x41, - 0x52, 0x4d, 0x36, 0x34, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4c, 0x49, 0x4e, 0x55, 0x58, 0x5f, - 0x41, 0x4e, 0x59, 0x10, 0x02, 0x1a, 0x02, 0x18, 0x01, 0x2a, 0x48, 0x0a, 0x08, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x00, 0x12, 0x07, - 0x0a, 0x03, 0x55, 0x44, 0x50, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x43, 0x50, 0x10, 0x02, - 0x12, 0x08, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x48, 0x54, - 0x54, 0x50, 0x32, 0x10, 0x04, 0x12, 0x08, 0x0a, 0x04, 0x47, 0x52, 0x50, 0x43, 0x10, 0x05, 0x1a, - 0x02, 0x18, 0x01, 0x2a, 0x21, 0x0a, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x48, - 0x4f, 0x53, 0x54, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x47, 0x52, 0x45, 0x53, 0x53, - 0x10, 0x01, 0x1a, 0x02, 0x18, 0x01, 0x2a, 0x37, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, - 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x52, 0x49, 0x56, 0x41, 0x54, 0x45, 0x10, 0x01, 0x12, - 0x0a, 0x0a, 0x06, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x10, 0x02, 0x1a, 0x02, 0x18, 0x01, 0x2a, - 0x61, 0x0a, 0x10, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x54, - 0x69, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x1d, 0x53, 0x55, 0x42, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x49, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, - 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x48, 0x4f, 0x42, 0x42, 0x59, 0x10, - 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x45, 0x52, 0x53, 0x4f, 0x4e, 0x41, 0x4c, 0x10, 0x02, 0x12, - 0x07, 0x0a, 0x03, 0x50, 0x52, 0x4f, 0x10, 0x03, 0x12, 0x08, 0x0a, 0x04, 0x54, 0x45, 0x41, 0x4d, - 0x10, 0x04, 0x32, 0x8b, 0x1a, 0x0a, 0x10, 0x46, 0x61, 0x62, 0x72, 0x69, 0x63, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x14, 0x2e, 0x69, - 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x40, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x15, 0x2e, - 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x40, 0x0a, 0x05, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, - 0x31, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, - 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x0b, 0x52, - 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x25, 0x0a, 0x0e, 0x70, 0x75, 0x6c, 0x75, 0x6d, 0x69, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, + 0x77, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x70, 0x75, 0x6c, 0x75, 0x6d, 0x69, 0x50, + 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x22, 0xa6, 0x01, 0x0a, 0x10, 0x45, 0x73, 0x74, 0x69, 0x6d, + 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6e, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x20, 0x0a, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, + 0x04, 0x75, 0x6e, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x6e, 0x69, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x02, 0x52, 0x08, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x26, 0x0a, + 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, + 0x04, 0x63, 0x6f, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, + 0xcd, 0x01, 0x0a, 0x10, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, + 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x08, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, + 0x12, 0x2e, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, + 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x08, 0x73, 0x75, 0x62, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x12, 0x3d, 0x0a, 0x0a, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, + 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6e, 0x65, + 0x49, 0x74, 0x65, 0x6d, 0x52, 0x09, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, + 0xdf, 0x01, 0x0a, 0x0e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x32, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x08, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x30, + 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x69, + 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x65, 0x74, 0x61, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x12, 0x21, + 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, + 0x65, 0x22, 0x25, 0x0a, 0x0f, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x2a, 0x54, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x14, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, + 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0a, + 0x0a, 0x06, 0x44, 0x45, 0x46, 0x41, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x57, + 0x53, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x49, 0x47, 0x49, 0x54, 0x41, 0x4c, 0x4f, 0x43, + 0x45, 0x41, 0x4e, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x47, 0x43, 0x50, 0x10, 0x04, 0x2a, 0x54, + 0x0a, 0x0e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x6f, 0x64, 0x65, + 0x12, 0x14, 0x0a, 0x10, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, + 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x44, 0x45, 0x56, 0x45, 0x4c, 0x4f, + 0x50, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x41, 0x47, 0x49, + 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x50, 0x52, 0x4f, 0x44, 0x55, 0x43, 0x54, 0x49, + 0x4f, 0x4e, 0x10, 0x03, 0x2a, 0xa3, 0x02, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x4f, 0x54, 0x5f, 0x53, 0x50, 0x45, + 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x42, 0x55, 0x49, 0x4c, + 0x44, 0x5f, 0x51, 0x55, 0x45, 0x55, 0x45, 0x44, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x42, 0x55, + 0x49, 0x4c, 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x49, 0x4e, 0x47, + 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x50, 0x45, 0x4e, 0x44, + 0x49, 0x4e, 0x47, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x41, + 0x43, 0x54, 0x49, 0x56, 0x41, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x11, 0x0a, 0x0d, 0x42, + 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, 0x12, + 0x0a, 0x0e, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x49, 0x4e, 0x47, + 0x10, 0x06, 0x12, 0x11, 0x0a, 0x0d, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x51, 0x55, 0x45, + 0x55, 0x45, 0x44, 0x10, 0x07, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, + 0x45, 0x4e, 0x54, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x08, 0x12, 0x18, 0x0a, + 0x14, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x43, 0x4f, 0x4d, 0x50, + 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x09, 0x12, 0x15, 0x0a, 0x11, 0x44, 0x45, 0x50, 0x4c, 0x4f, + 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x0a, 0x12, 0x10, + 0x0a, 0x0c, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x0b, + 0x12, 0x18, 0x0a, 0x14, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x53, + 0x43, 0x41, 0x4c, 0x45, 0x44, 0x5f, 0x49, 0x4e, 0x10, 0x0c, 0x2a, 0x42, 0x0a, 0x0a, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x4f, 0x4e, 0x46, + 0x49, 0x47, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, + 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x53, 0x45, 0x4e, 0x53, 0x49, 0x54, 0x49, 0x56, 0x45, 0x10, 0x01, 0x2a, 0x6a, + 0x0a, 0x0e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x1f, 0x0a, 0x1b, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, + 0x00, 0x12, 0x1b, 0x0a, 0x17, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x48, 0x49, 0x53, 0x54, 0x4f, 0x52, 0x59, 0x10, 0x01, 0x12, 0x1a, + 0x0a, 0x16, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x02, 0x2a, 0x6b, 0x0a, 0x10, 0x44, 0x65, + 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, + 0x0a, 0x1d, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x41, 0x43, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, + 0x00, 0x12, 0x18, 0x0a, 0x14, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, + 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x50, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x44, + 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x02, 0x2a, 0x61, 0x0a, 0x10, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x1d, 0x53, + 0x55, 0x42, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x49, 0x45, 0x52, + 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x09, + 0x0a, 0x05, 0x48, 0x4f, 0x42, 0x42, 0x59, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x45, 0x52, + 0x53, 0x4f, 0x4e, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x50, 0x52, 0x4f, 0x10, 0x03, + 0x12, 0x08, 0x0a, 0x04, 0x54, 0x45, 0x41, 0x4d, 0x10, 0x04, 0x32, 0x8b, 0x1a, 0x0a, 0x10, 0x46, + 0x61, 0x62, 0x72, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x12, + 0x3e, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x14, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, + 0x40, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x15, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, + 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x03, 0x90, 0x02, + 0x01, 0x12, 0x40, 0x0a, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1a, 0x2e, 0x69, 0x6f, 0x2e, + 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, + 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x0b, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x12, 0x3f, 0x0a, 0x04, 0x54, 0x61, 0x69, 0x6c, 0x12, 0x19, 0x2e, 0x69, 0x6f, 0x2e, + 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x69, 0x6c, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, + 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x30, 0x01, 0x12, 0x3f, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x15, 0x2e, + 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x1a, 0x19, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, + 0x03, 0x88, 0x02, 0x01, 0x12, 0x43, 0x0a, 0x06, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x12, 0x1b, + 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, + 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6f, + 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x03, 0x47, 0x65, 0x74, + 0x12, 0x18, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x69, 0x6f, 0x2e, + 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x48, 0x0a, 0x06, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x12, 0x1b, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x03, 0x88, 0x02, 0x01, 0x12, 0x4b, 0x0a, 0x07, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x12, + 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, + 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, + 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x73, + 0x74, 0x72, 0x6f, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, + 0x02, 0x12, 0x44, 0x0a, 0x07, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x12, 0x1c, 0x2e, 0x69, + 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x62, 0x6c, + 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3f, 0x0a, 0x04, 0x54, 0x61, - 0x69, 0x6c, 0x12, 0x19, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, - 0x31, 0x2e, 0x54, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, - 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x69, - 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x3f, 0x0a, 0x06, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x15, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, - 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, 0x19, 0x2e, 0x69, - 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x43, 0x0a, 0x06, - 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x12, 0x1b, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, - 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, - 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x3f, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x18, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, - 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, - 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x03, 0x90, - 0x02, 0x01, 0x12, 0x48, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x1b, 0x2e, 0x69, - 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x64, - 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x4b, 0x0a, 0x07, - 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x12, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, - 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, - 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x02, 0x12, 0x44, 0x0a, 0x07, 0x50, 0x75, 0x62, - 0x6c, 0x69, 0x73, 0x68, 0x12, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, - 0x4e, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1e, 0x2e, 0x69, - 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x73, - 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x69, - 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x73, - 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, - 0x57, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x20, - 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x21, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x58, 0x0a, 0x0d, 0x47, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x69, 0x6f, 0x2e, 0x64, - 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, - 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, - 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x58, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x72, 0x74, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x12, 0x22, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, - 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x47, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5f, 0x0a, 0x0e, - 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x23, - 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x40, 0x0a, - 0x05, 0x44, 0x65, 0x62, 0x75, 0x67, 0x12, 0x1a, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, - 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, - 0x31, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x3a, 0x0a, 0x08, 0x53, 0x69, 0x67, 0x6e, 0x45, 0x55, 0x4c, 0x41, 0x12, 0x16, 0x2e, 0x67, 0x6f, + 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x4e, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x62, 0x65, 0x12, 0x1e, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x57, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x20, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, + 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, + 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, + 0x12, 0x58, 0x0a, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, + 0x73, 0x12, 0x22, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, + 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x0d, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x22, 0x2e, 0x69, 0x6f, + 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x23, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5f, 0x0a, 0x0e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x23, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, + 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x69, 0x6f, + 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x40, 0x0a, 0x05, 0x44, 0x65, 0x62, 0x75, 0x67, 0x12, 0x1a, + 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, + 0x62, 0x75, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6f, 0x2e, + 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x08, 0x53, 0x69, 0x67, 0x6e, 0x45, + 0x55, 0x4c, 0x41, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3f, 0x0a, 0x08, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x54, 0x6f, 0x53, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x70, 0x74, 0x79, 0x12, 0x3f, 0x0a, 0x08, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x6f, 0x53, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x48, 0x0a, 0x09, - 0x50, 0x75, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x1e, 0x2e, 0x69, 0x6f, 0x2e, 0x64, - 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x43, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x15, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, - 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x1a, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x4e, 0x0a, 0x0b, 0x4c, - 0x69, 0x73, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x20, 0x2e, 0x69, 0x6f, 0x2e, - 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x69, - 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63, 0x72, - 0x65, 0x74, 0x73, 0x22, 0x06, 0x88, 0x02, 0x01, 0x90, 0x02, 0x01, 0x12, 0x54, 0x0a, 0x0a, 0x47, - 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x1f, 0x2e, 0x69, 0x6f, 0x2e, 0x64, - 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x69, 0x6f, 0x2e, - 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, - 0x01, 0x12, 0x48, 0x0a, 0x09, 0x50, 0x75, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1e, - 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x90, 0x02, 0x02, 0x12, 0x50, 0x0a, 0x0d, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x22, 0x2e, 0x69, - 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x90, 0x02, 0x02, 0x12, 0x57, 0x0a, - 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x20, 0x2e, 0x69, - 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, - 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x50, 0x0a, 0x0d, 0x50, 0x75, 0x74, 0x44, 0x65, 0x70, - 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, - 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x03, 0x90, 0x02, 0x02, 0x12, 0x63, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, - 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x69, 0x6f, - 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, - 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x52, 0x0a, - 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x52, 0x4c, - 0x12, 0x1e, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, - 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1f, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, - 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x70, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, - 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x2a, 0x2e, 0x69, 0x6f, 0x2e, - 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, - 0x74, 0x65, 0x53, 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, - 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, - 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x75, 0x62, - 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x28, 0x2e, 0x69, 0x6f, 0x2e, - 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x53, 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x90, 0x02, - 0x02, 0x12, 0x7b, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, - 0x53, 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x2d, 0x2e, - 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, - 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x69, - 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, - 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, 0x6e, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x4a, - 0x0a, 0x0a, 0x53, 0x65, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x2e, 0x69, - 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x90, 0x02, 0x02, 0x12, 0x43, 0x0a, 0x06, 0x57, 0x68, - 0x6f, 0x41, 0x6d, 0x49, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1c, 0x2e, 0x69, - 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x68, 0x6f, 0x41, - 0x6d, 0x49, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, - 0x3b, 0x0a, 0x05, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x12, 0x1a, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, - 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3f, 0x0a, 0x08, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, + 0x03, 0x90, 0x02, 0x01, 0x12, 0x48, 0x0a, 0x09, 0x50, 0x75, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, + 0x74, 0x12, 0x1e, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x75, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x43, + 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, + 0x15, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, + 0x88, 0x02, 0x01, 0x12, 0x4e, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, + 0x74, 0x73, 0x12, 0x20, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x22, 0x06, 0x88, 0x02, 0x01, + 0x90, 0x02, 0x01, 0x12, 0x54, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x73, 0x12, 0x1f, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x48, 0x0a, 0x09, 0x50, 0x75, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1e, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, + 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, + 0x90, 0x02, 0x02, 0x12, 0x50, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x73, 0x12, 0x22, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x90, 0x02, 0x02, 0x12, 0x52, 0x0a, - 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x44, 0x4e, 0x53, 0x53, 0x65, 0x74, 0x75, 0x70, 0x12, - 0x23, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x79, 0x44, 0x4e, 0x53, 0x53, 0x65, 0x74, 0x75, 0x70, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x90, 0x02, - 0x01, 0x12, 0x6f, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x28, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, - 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, - 0x02, 0x01, 0x12, 0x5c, 0x0a, 0x13, 0x53, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, - 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x28, 0x2e, 0x69, 0x6f, 0x2e, 0x64, - 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, - 0x63, 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x22, 0x03, 0x90, 0x02, 0x02, 0x12, 0x57, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x73, 0x12, 0x20, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, + 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x50, + 0x0a, 0x0d, 0x50, 0x75, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x22, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x75, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x90, 0x02, 0x02, - 0x12, 0x4b, 0x0a, 0x07, 0x43, 0x61, 0x6e, 0x49, 0x55, 0x73, 0x65, 0x12, 0x1c, 0x2e, 0x69, 0x6f, - 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6e, 0x49, 0x55, - 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6f, 0x2e, 0x64, - 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6e, 0x49, 0x55, 0x73, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x49, 0x0a, - 0x08, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x12, 0x1d, 0x2e, 0x69, 0x6f, 0x2e, 0x64, - 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, - 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x07, 0x50, 0x72, 0x65, 0x76, - 0x69, 0x65, 0x77, 0x12, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x12, 0x63, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6f, 0x2e, 0x64, + 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, + 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x52, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, + 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x52, 0x4c, 0x12, 0x1e, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, + 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x52, + 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, + 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x52, + 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x15, 0x44, 0x65, 0x6c, + 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, + 0x6e, 0x65, 0x12, 0x2a, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, + 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x64, 0x6f, 0x6d, + 0x61, 0x69, 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, + 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, + 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, + 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x13, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, + 0x6e, 0x65, 0x12, 0x28, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, + 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, + 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x90, 0x02, 0x02, 0x12, 0x7b, 0x0a, 0x18, 0x47, 0x65, 0x74, + 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, + 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x2d, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, + 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, + 0x53, 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x64, + 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x4a, 0x0a, 0x0a, 0x53, 0x65, 0x74, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x90, + 0x02, 0x02, 0x12, 0x43, 0x0a, 0x06, 0x57, 0x68, 0x6f, 0x41, 0x6d, 0x49, 0x12, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, + 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x68, 0x6f, 0x41, 0x6d, 0x49, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x3b, 0x0a, 0x05, 0x54, 0x72, 0x61, 0x63, 0x6b, + 0x12, 0x1a, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, + 0x54, 0x72, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3f, 0x0a, 0x08, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x65, + 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x22, 0x03, 0x90, 0x02, 0x02, 0x12, 0x52, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x44, + 0x4e, 0x53, 0x53, 0x65, 0x74, 0x75, 0x70, 0x12, 0x23, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, + 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x44, 0x4e, 0x53, + 0x53, 0x65, 0x74, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x6f, 0x0a, 0x13, 0x47, 0x65, 0x74, + 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x12, 0x28, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x69, 0x6f, 0x2e, + 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x5c, 0x0a, 0x13, 0x53, 0x65, + 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x12, 0x28, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x03, 0x90, 0x02, 0x02, 0x12, 0x4b, 0x0a, 0x07, 0x43, 0x61, 0x6e, 0x49, + 0x55, 0x73, 0x65, 0x12, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6e, 0x49, 0x55, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, - 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x42, 0xb0, 0x01, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, - 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x42, 0x0b, 0x46, 0x61, 0x62, 0x72, 0x69, 0x63, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x44, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x4c, 0x61, 0x62, 0x73, 0x2f, 0x64, 0x65, 0x66, 0x61, - 0x6e, 0x67, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x69, 0x6f, - 0x2f, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2f, 0x76, 0x31, 0x3b, 0x64, 0x65, 0x66, 0x61, 0x6e, - 0x67, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x49, 0x44, 0x58, 0xaa, 0x02, 0x0c, 0x49, 0x6f, 0x2e, 0x44, - 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0c, 0x49, 0x6f, 0x5c, 0x44, 0x65, - 0x66, 0x61, 0x6e, 0x67, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x18, 0x49, 0x6f, 0x5c, 0x44, 0x65, 0x66, - 0x61, 0x6e, 0x67, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0xea, 0x02, 0x0e, 0x49, 0x6f, 0x3a, 0x3a, 0x44, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x3a, - 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x2e, 0x43, 0x61, 0x6e, 0x49, 0x55, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x49, 0x0a, 0x08, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, + 0x65, 0x12, 0x1d, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, + 0x2e, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1e, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, + 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x46, 0x0a, 0x07, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x12, 0x1c, 0x2e, 0x69, 0x6f, + 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, + 0x65, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6f, 0x2e, 0x64, + 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0xb0, 0x01, 0x0a, 0x10, 0x63, 0x6f, 0x6d, + 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x42, 0x0b, 0x46, + 0x61, 0x62, 0x72, 0x69, 0x63, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3d, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x4c, + 0x61, 0x62, 0x73, 0x2f, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x69, 0x6f, 0x2f, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2f, + 0x76, 0x31, 0x3b, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x49, 0x44, + 0x58, 0xaa, 0x02, 0x0c, 0x49, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x56, 0x31, + 0xca, 0x02, 0x0c, 0x49, 0x6f, 0x5c, 0x44, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x5c, 0x56, 0x31, 0xe2, + 0x02, 0x18, 0x49, 0x6f, 0x5c, 0x44, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x5c, 0x56, 0x31, 0x5c, 0x47, + 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0e, 0x49, 0x6f, 0x3a, + 0x3a, 0x44, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( @@ -6577,8 +5368,8 @@ func file_io_defang_v1_fabric_proto_rawDescGZIP() []byte { return file_io_defang_v1_fabric_proto_rawDescData } -var file_io_defang_v1_fabric_proto_enumTypes = make([]protoimpl.EnumInfo, 12) -var file_io_defang_v1_fabric_proto_msgTypes = make([]protoimpl.MessageInfo, 81) +var file_io_defang_v1_fabric_proto_enumTypes = make([]protoimpl.EnumInfo, 8) +var file_io_defang_v1_fabric_proto_msgTypes = make([]protoimpl.MessageInfo, 67) var file_io_defang_v1_fabric_proto_goTypes = []any{ (Provider)(0), // 0: io.defang.v1.Provider (DeploymentMode)(0), // 1: io.defang.v1.DeploymentMode @@ -6586,255 +5377,218 @@ var file_io_defang_v1_fabric_proto_goTypes = []any{ (ConfigType)(0), // 3: io.defang.v1.ConfigType (DeploymentType)(0), // 4: io.defang.v1.DeploymentType (DeploymentAction)(0), // 5: io.defang.v1.DeploymentAction - (Platform)(0), // 6: io.defang.v1.Platform - (Protocol)(0), // 7: io.defang.v1.Protocol - (Mode)(0), // 8: io.defang.v1.Mode - (Network)(0), // 9: io.defang.v1.Network - (SubscriptionTier)(0), // 10: io.defang.v1.SubscriptionTier - (TailRequest_LogType)(0), // 11: io.defang.v1.TailRequest.LogType - (*GetSelectedProviderRequest)(nil), // 12: io.defang.v1.GetSelectedProviderRequest - (*GetSelectedProviderResponse)(nil), // 13: io.defang.v1.GetSelectedProviderResponse - (*SetSelectedProviderRequest)(nil), // 14: io.defang.v1.SetSelectedProviderRequest - (*VerifyDNSSetupRequest)(nil), // 15: io.defang.v1.VerifyDNSSetupRequest - (*DestroyRequest)(nil), // 16: io.defang.v1.DestroyRequest - (*DestroyResponse)(nil), // 17: io.defang.v1.DestroyResponse - (*DebugRequest)(nil), // 18: io.defang.v1.DebugRequest - (*DebugResponse)(nil), // 19: io.defang.v1.DebugResponse - (*Issue)(nil), // 20: io.defang.v1.Issue - (*CodeChange)(nil), // 21: io.defang.v1.CodeChange - (*TrackRequest)(nil), // 22: io.defang.v1.TrackRequest - (*CanIUseRequest)(nil), // 23: io.defang.v1.CanIUseRequest - (*CanIUseResponse)(nil), // 24: io.defang.v1.CanIUseResponse - (*DeployRequest)(nil), // 25: io.defang.v1.DeployRequest - (*DeployResponse)(nil), // 26: io.defang.v1.DeployResponse - (*DeleteRequest)(nil), // 27: io.defang.v1.DeleteRequest - (*DeleteResponse)(nil), // 28: io.defang.v1.DeleteResponse - (*GenerateFilesRequest)(nil), // 29: io.defang.v1.GenerateFilesRequest - (*File)(nil), // 30: io.defang.v1.File - (*GenerateFilesResponse)(nil), // 31: io.defang.v1.GenerateFilesResponse - (*StartGenerateResponse)(nil), // 32: io.defang.v1.StartGenerateResponse - (*GenerateStatusRequest)(nil), // 33: io.defang.v1.GenerateStatusRequest - (*UploadURLRequest)(nil), // 34: io.defang.v1.UploadURLRequest - (*UploadURLResponse)(nil), // 35: io.defang.v1.UploadURLResponse - (*ServiceInfo)(nil), // 36: io.defang.v1.ServiceInfo - (*Secrets)(nil), // 37: io.defang.v1.Secrets - (*SecretValue)(nil), // 38: io.defang.v1.SecretValue - (*Config)(nil), // 39: io.defang.v1.Config - (*ConfigKey)(nil), // 40: io.defang.v1.ConfigKey - (*PutConfigRequest)(nil), // 41: io.defang.v1.PutConfigRequest - (*GetConfigsRequest)(nil), // 42: io.defang.v1.GetConfigsRequest - (*GetConfigsResponse)(nil), // 43: io.defang.v1.GetConfigsResponse - (*DeleteConfigsRequest)(nil), // 44: io.defang.v1.DeleteConfigsRequest - (*ListConfigsRequest)(nil), // 45: io.defang.v1.ListConfigsRequest - (*ListConfigsResponse)(nil), // 46: io.defang.v1.ListConfigsResponse - (*Deployment)(nil), // 47: io.defang.v1.Deployment - (*PutDeploymentRequest)(nil), // 48: io.defang.v1.PutDeploymentRequest - (*ListDeploymentsRequest)(nil), // 49: io.defang.v1.ListDeploymentsRequest - (*ListDeploymentsResponse)(nil), // 50: io.defang.v1.ListDeploymentsResponse - (*TokenRequest)(nil), // 51: io.defang.v1.TokenRequest - (*TokenResponse)(nil), // 52: io.defang.v1.TokenResponse - (*Status)(nil), // 53: io.defang.v1.Status - (*Version)(nil), // 54: io.defang.v1.Version - (*TailRequest)(nil), // 55: io.defang.v1.TailRequest - (*LogEntry)(nil), // 56: io.defang.v1.LogEntry - (*TailResponse)(nil), // 57: io.defang.v1.TailResponse - (*GetServicesResponse)(nil), // 58: io.defang.v1.GetServicesResponse - (*ProjectUpdate)(nil), // 59: io.defang.v1.ProjectUpdate - (*ServiceID)(nil), // 60: io.defang.v1.ServiceID - (*GetRequest)(nil), // 61: io.defang.v1.GetRequest - (*Device)(nil), // 62: io.defang.v1.Device - (*Resource)(nil), // 63: io.defang.v1.Resource - (*Resources)(nil), // 64: io.defang.v1.Resources - (*Deploy)(nil), // 65: io.defang.v1.Deploy - (*Port)(nil), // 66: io.defang.v1.Port - (*Secret)(nil), // 67: io.defang.v1.Secret - (*Build)(nil), // 68: io.defang.v1.Build - (*HealthCheck)(nil), // 69: io.defang.v1.HealthCheck - (*Service)(nil), // 70: io.defang.v1.Service - (*StaticFiles)(nil), // 71: io.defang.v1.StaticFiles - (*Redis)(nil), // 72: io.defang.v1.Redis - (*DeployEvent)(nil), // 73: io.defang.v1.DeployEvent - (*Event)(nil), // 74: io.defang.v1.Event - (*PublishRequest)(nil), // 75: io.defang.v1.PublishRequest - (*SubscribeRequest)(nil), // 76: io.defang.v1.SubscribeRequest - (*SubscribeResponse)(nil), // 77: io.defang.v1.SubscribeResponse - (*GetServicesRequest)(nil), // 78: io.defang.v1.GetServicesRequest - (*DelegateSubdomainZoneRequest)(nil), // 79: io.defang.v1.DelegateSubdomainZoneRequest - (*DelegateSubdomainZoneResponse)(nil), // 80: io.defang.v1.DelegateSubdomainZoneResponse - (*DeleteSubdomainZoneRequest)(nil), // 81: io.defang.v1.DeleteSubdomainZoneRequest - (*GetDelegateSubdomainZoneRequest)(nil), // 82: io.defang.v1.GetDelegateSubdomainZoneRequest - (*SetOptionsRequest)(nil), // 83: io.defang.v1.SetOptionsRequest - (*WhoAmIResponse)(nil), // 84: io.defang.v1.WhoAmIResponse - (*EstimateRequest)(nil), // 85: io.defang.v1.EstimateRequest - (*EstimateLineItem)(nil), // 86: io.defang.v1.EstimateLineItem - (*EstimateResponse)(nil), // 87: io.defang.v1.EstimateResponse - (*PreviewRequest)(nil), // 88: io.defang.v1.PreviewRequest - (*PreviewResponse)(nil), // 89: io.defang.v1.PreviewResponse - nil, // 90: io.defang.v1.TrackRequest.PropertiesEntry - nil, // 91: io.defang.v1.Build.ArgsEntry - nil, // 92: io.defang.v1.Service.EnvironmentEntry - (*timestamppb.Timestamp)(nil), // 93: google.protobuf.Timestamp - (*_type.Money)(nil), // 94: google.type.Money - (*emptypb.Empty)(nil), // 95: google.protobuf.Empty + (SubscriptionTier)(0), // 6: io.defang.v1.SubscriptionTier + (TailRequest_LogType)(0), // 7: io.defang.v1.TailRequest.LogType + (*GetSelectedProviderRequest)(nil), // 8: io.defang.v1.GetSelectedProviderRequest + (*GetSelectedProviderResponse)(nil), // 9: io.defang.v1.GetSelectedProviderResponse + (*SetSelectedProviderRequest)(nil), // 10: io.defang.v1.SetSelectedProviderRequest + (*VerifyDNSSetupRequest)(nil), // 11: io.defang.v1.VerifyDNSSetupRequest + (*DestroyRequest)(nil), // 12: io.defang.v1.DestroyRequest + (*DestroyResponse)(nil), // 13: io.defang.v1.DestroyResponse + (*DebugRequest)(nil), // 14: io.defang.v1.DebugRequest + (*DebugResponse)(nil), // 15: io.defang.v1.DebugResponse + (*Issue)(nil), // 16: io.defang.v1.Issue + (*CodeChange)(nil), // 17: io.defang.v1.CodeChange + (*TrackRequest)(nil), // 18: io.defang.v1.TrackRequest + (*CanIUseRequest)(nil), // 19: io.defang.v1.CanIUseRequest + (*CanIUseResponse)(nil), // 20: io.defang.v1.CanIUseResponse + (*DeployRequest)(nil), // 21: io.defang.v1.DeployRequest + (*DeployResponse)(nil), // 22: io.defang.v1.DeployResponse + (*DeleteRequest)(nil), // 23: io.defang.v1.DeleteRequest + (*DeleteResponse)(nil), // 24: io.defang.v1.DeleteResponse + (*GenerateFilesRequest)(nil), // 25: io.defang.v1.GenerateFilesRequest + (*File)(nil), // 26: io.defang.v1.File + (*GenerateFilesResponse)(nil), // 27: io.defang.v1.GenerateFilesResponse + (*StartGenerateResponse)(nil), // 28: io.defang.v1.StartGenerateResponse + (*GenerateStatusRequest)(nil), // 29: io.defang.v1.GenerateStatusRequest + (*UploadURLRequest)(nil), // 30: io.defang.v1.UploadURLRequest + (*UploadURLResponse)(nil), // 31: io.defang.v1.UploadURLResponse + (*ServiceInfo)(nil), // 32: io.defang.v1.ServiceInfo + (*Secrets)(nil), // 33: io.defang.v1.Secrets + (*SecretValue)(nil), // 34: io.defang.v1.SecretValue + (*Config)(nil), // 35: io.defang.v1.Config + (*ConfigKey)(nil), // 36: io.defang.v1.ConfigKey + (*PutConfigRequest)(nil), // 37: io.defang.v1.PutConfigRequest + (*GetConfigsRequest)(nil), // 38: io.defang.v1.GetConfigsRequest + (*GetConfigsResponse)(nil), // 39: io.defang.v1.GetConfigsResponse + (*DeleteConfigsRequest)(nil), // 40: io.defang.v1.DeleteConfigsRequest + (*ListConfigsRequest)(nil), // 41: io.defang.v1.ListConfigsRequest + (*ListConfigsResponse)(nil), // 42: io.defang.v1.ListConfigsResponse + (*Deployment)(nil), // 43: io.defang.v1.Deployment + (*PutDeploymentRequest)(nil), // 44: io.defang.v1.PutDeploymentRequest + (*ListDeploymentsRequest)(nil), // 45: io.defang.v1.ListDeploymentsRequest + (*ListDeploymentsResponse)(nil), // 46: io.defang.v1.ListDeploymentsResponse + (*TokenRequest)(nil), // 47: io.defang.v1.TokenRequest + (*TokenResponse)(nil), // 48: io.defang.v1.TokenResponse + (*Status)(nil), // 49: io.defang.v1.Status + (*Version)(nil), // 50: io.defang.v1.Version + (*TailRequest)(nil), // 51: io.defang.v1.TailRequest + (*LogEntry)(nil), // 52: io.defang.v1.LogEntry + (*TailResponse)(nil), // 53: io.defang.v1.TailResponse + (*GetServicesResponse)(nil), // 54: io.defang.v1.GetServicesResponse + (*ProjectUpdate)(nil), // 55: io.defang.v1.ProjectUpdate + (*GetRequest)(nil), // 56: io.defang.v1.GetRequest + (*Service)(nil), // 57: io.defang.v1.Service + (*Event)(nil), // 58: io.defang.v1.Event + (*PublishRequest)(nil), // 59: io.defang.v1.PublishRequest + (*SubscribeRequest)(nil), // 60: io.defang.v1.SubscribeRequest + (*SubscribeResponse)(nil), // 61: io.defang.v1.SubscribeResponse + (*GetServicesRequest)(nil), // 62: io.defang.v1.GetServicesRequest + (*DelegateSubdomainZoneRequest)(nil), // 63: io.defang.v1.DelegateSubdomainZoneRequest + (*DelegateSubdomainZoneResponse)(nil), // 64: io.defang.v1.DelegateSubdomainZoneResponse + (*DeleteSubdomainZoneRequest)(nil), // 65: io.defang.v1.DeleteSubdomainZoneRequest + (*GetDelegateSubdomainZoneRequest)(nil), // 66: io.defang.v1.GetDelegateSubdomainZoneRequest + (*SetOptionsRequest)(nil), // 67: io.defang.v1.SetOptionsRequest + (*WhoAmIResponse)(nil), // 68: io.defang.v1.WhoAmIResponse + (*EstimateRequest)(nil), // 69: io.defang.v1.EstimateRequest + (*EstimateLineItem)(nil), // 70: io.defang.v1.EstimateLineItem + (*EstimateResponse)(nil), // 71: io.defang.v1.EstimateResponse + (*PreviewRequest)(nil), // 72: io.defang.v1.PreviewRequest + (*PreviewResponse)(nil), // 73: io.defang.v1.PreviewResponse + nil, // 74: io.defang.v1.TrackRequest.PropertiesEntry + (*timestamppb.Timestamp)(nil), // 75: google.protobuf.Timestamp + (*_type.Money)(nil), // 76: google.type.Money + (*emptypb.Empty)(nil), // 77: google.protobuf.Empty } var file_io_defang_v1_fabric_proto_depIdxs = []int32{ - 0, // 0: io.defang.v1.GetSelectedProviderResponse.provider:type_name -> io.defang.v1.Provider - 0, // 1: io.defang.v1.SetSelectedProviderRequest.provider:type_name -> io.defang.v1.Provider - 30, // 2: io.defang.v1.DebugRequest.files:type_name -> io.defang.v1.File - 93, // 3: io.defang.v1.DebugRequest.since:type_name -> google.protobuf.Timestamp - 93, // 4: io.defang.v1.DebugRequest.until:type_name -> google.protobuf.Timestamp - 20, // 5: io.defang.v1.DebugResponse.issues:type_name -> io.defang.v1.Issue - 21, // 6: io.defang.v1.Issue.code_changes:type_name -> io.defang.v1.CodeChange - 90, // 7: io.defang.v1.TrackRequest.properties:type_name -> io.defang.v1.TrackRequest.PropertiesEntry - 0, // 8: io.defang.v1.CanIUseRequest.provider:type_name -> io.defang.v1.Provider - 70, // 9: io.defang.v1.DeployRequest.services:type_name -> io.defang.v1.Service - 1, // 10: io.defang.v1.DeployRequest.mode:type_name -> io.defang.v1.DeploymentMode - 36, // 11: io.defang.v1.DeployResponse.services:type_name -> io.defang.v1.ServiceInfo - 30, // 12: io.defang.v1.GenerateFilesResponse.files:type_name -> io.defang.v1.File - 70, // 13: io.defang.v1.ServiceInfo.service:type_name -> io.defang.v1.Service - 93, // 14: io.defang.v1.ServiceInfo.created_at:type_name -> google.protobuf.Timestamp - 93, // 15: io.defang.v1.ServiceInfo.updated_at:type_name -> google.protobuf.Timestamp - 2, // 16: io.defang.v1.ServiceInfo.state:type_name -> io.defang.v1.ServiceState - 3, // 17: io.defang.v1.Config.type:type_name -> io.defang.v1.ConfigType - 3, // 18: io.defang.v1.PutConfigRequest.type:type_name -> io.defang.v1.ConfigType - 40, // 19: io.defang.v1.GetConfigsRequest.configs:type_name -> io.defang.v1.ConfigKey - 39, // 20: io.defang.v1.GetConfigsResponse.configs:type_name -> io.defang.v1.Config - 40, // 21: io.defang.v1.DeleteConfigsRequest.configs:type_name -> io.defang.v1.ConfigKey - 40, // 22: io.defang.v1.ListConfigsResponse.configs:type_name -> io.defang.v1.ConfigKey - 93, // 23: io.defang.v1.Deployment.timestamp:type_name -> google.protobuf.Timestamp - 5, // 24: io.defang.v1.Deployment.action:type_name -> io.defang.v1.DeploymentAction - 0, // 25: io.defang.v1.Deployment.provider:type_name -> io.defang.v1.Provider - 47, // 26: io.defang.v1.PutDeploymentRequest.deployment:type_name -> io.defang.v1.Deployment - 4, // 27: io.defang.v1.ListDeploymentsRequest.type:type_name -> io.defang.v1.DeploymentType - 47, // 28: io.defang.v1.ListDeploymentsResponse.deployments:type_name -> io.defang.v1.Deployment - 93, // 29: io.defang.v1.TailRequest.since:type_name -> google.protobuf.Timestamp - 93, // 30: io.defang.v1.TailRequest.until:type_name -> google.protobuf.Timestamp - 93, // 31: io.defang.v1.LogEntry.timestamp:type_name -> google.protobuf.Timestamp - 56, // 32: io.defang.v1.TailResponse.entries:type_name -> io.defang.v1.LogEntry - 36, // 33: io.defang.v1.GetServicesResponse.services:type_name -> io.defang.v1.ServiceInfo - 93, // 34: io.defang.v1.GetServicesResponse.expires_at:type_name -> google.protobuf.Timestamp - 36, // 35: io.defang.v1.ProjectUpdate.services:type_name -> io.defang.v1.ServiceInfo - 1, // 36: io.defang.v1.ProjectUpdate.mode:type_name -> io.defang.v1.DeploymentMode - 0, // 37: io.defang.v1.ProjectUpdate.provider:type_name -> io.defang.v1.Provider - 62, // 38: io.defang.v1.Resource.devices:type_name -> io.defang.v1.Device - 63, // 39: io.defang.v1.Resources.reservations:type_name -> io.defang.v1.Resource - 64, // 40: io.defang.v1.Deploy.resources:type_name -> io.defang.v1.Resources - 7, // 41: io.defang.v1.Port.protocol:type_name -> io.defang.v1.Protocol - 8, // 42: io.defang.v1.Port.mode:type_name -> io.defang.v1.Mode - 91, // 43: io.defang.v1.Build.args:type_name -> io.defang.v1.Build.ArgsEntry - 6, // 44: io.defang.v1.Service.platform:type_name -> io.defang.v1.Platform - 65, // 45: io.defang.v1.Service.deploy:type_name -> io.defang.v1.Deploy - 66, // 46: io.defang.v1.Service.ports:type_name -> io.defang.v1.Port - 92, // 47: io.defang.v1.Service.environment:type_name -> io.defang.v1.Service.EnvironmentEntry - 68, // 48: io.defang.v1.Service.build:type_name -> io.defang.v1.Build - 67, // 49: io.defang.v1.Service.secrets:type_name -> io.defang.v1.Secret - 69, // 50: io.defang.v1.Service.healthcheck:type_name -> io.defang.v1.HealthCheck - 71, // 51: io.defang.v1.Service.static_files:type_name -> io.defang.v1.StaticFiles - 9, // 52: io.defang.v1.Service.networks:type_name -> io.defang.v1.Network - 72, // 53: io.defang.v1.Service.redis:type_name -> io.defang.v1.Redis - 1, // 54: io.defang.v1.DeployEvent.mode:type_name -> io.defang.v1.DeploymentMode - 93, // 55: io.defang.v1.DeployEvent.time:type_name -> google.protobuf.Timestamp - 93, // 56: io.defang.v1.Event.time:type_name -> google.protobuf.Timestamp - 74, // 57: io.defang.v1.PublishRequest.event:type_name -> io.defang.v1.Event - 36, // 58: io.defang.v1.SubscribeResponse.service:type_name -> io.defang.v1.ServiceInfo - 2, // 59: io.defang.v1.SubscribeResponse.state:type_name -> io.defang.v1.ServiceState - 10, // 60: io.defang.v1.WhoAmIResponse.tier:type_name -> io.defang.v1.SubscriptionTier - 0, // 61: io.defang.v1.EstimateRequest.provider:type_name -> io.defang.v1.Provider - 94, // 62: io.defang.v1.EstimateLineItem.cost:type_name -> google.type.Money - 0, // 63: io.defang.v1.EstimateResponse.provider:type_name -> io.defang.v1.Provider - 94, // 64: io.defang.v1.EstimateResponse.subtotal:type_name -> google.type.Money - 86, // 65: io.defang.v1.EstimateResponse.line_items:type_name -> io.defang.v1.EstimateLineItem - 0, // 66: io.defang.v1.PreviewRequest.provider:type_name -> io.defang.v1.Provider - 1, // 67: io.defang.v1.PreviewRequest.mode:type_name -> io.defang.v1.DeploymentMode - 95, // 68: io.defang.v1.FabricController.GetStatus:input_type -> google.protobuf.Empty - 95, // 69: io.defang.v1.FabricController.GetVersion:input_type -> google.protobuf.Empty - 51, // 70: io.defang.v1.FabricController.Token:input_type -> io.defang.v1.TokenRequest - 95, // 71: io.defang.v1.FabricController.RevokeToken:input_type -> google.protobuf.Empty - 55, // 72: io.defang.v1.FabricController.Tail:input_type -> io.defang.v1.TailRequest - 70, // 73: io.defang.v1.FabricController.Update:input_type -> io.defang.v1.Service - 25, // 74: io.defang.v1.FabricController.Deploy:input_type -> io.defang.v1.DeployRequest - 61, // 75: io.defang.v1.FabricController.Get:input_type -> io.defang.v1.GetRequest - 27, // 76: io.defang.v1.FabricController.Delete:input_type -> io.defang.v1.DeleteRequest - 16, // 77: io.defang.v1.FabricController.Destroy:input_type -> io.defang.v1.DestroyRequest - 75, // 78: io.defang.v1.FabricController.Publish:input_type -> io.defang.v1.PublishRequest - 76, // 79: io.defang.v1.FabricController.Subscribe:input_type -> io.defang.v1.SubscribeRequest - 78, // 80: io.defang.v1.FabricController.GetServices:input_type -> io.defang.v1.GetServicesRequest - 29, // 81: io.defang.v1.FabricController.GenerateFiles:input_type -> io.defang.v1.GenerateFilesRequest - 29, // 82: io.defang.v1.FabricController.StartGenerate:input_type -> io.defang.v1.GenerateFilesRequest - 33, // 83: io.defang.v1.FabricController.GenerateStatus:input_type -> io.defang.v1.GenerateStatusRequest - 18, // 84: io.defang.v1.FabricController.Debug:input_type -> io.defang.v1.DebugRequest - 95, // 85: io.defang.v1.FabricController.SignEULA:input_type -> google.protobuf.Empty - 95, // 86: io.defang.v1.FabricController.CheckToS:input_type -> google.protobuf.Empty - 41, // 87: io.defang.v1.FabricController.PutSecret:input_type -> io.defang.v1.PutConfigRequest - 37, // 88: io.defang.v1.FabricController.DeleteSecrets:input_type -> io.defang.v1.Secrets - 45, // 89: io.defang.v1.FabricController.ListSecrets:input_type -> io.defang.v1.ListConfigsRequest - 42, // 90: io.defang.v1.FabricController.GetConfigs:input_type -> io.defang.v1.GetConfigsRequest - 41, // 91: io.defang.v1.FabricController.PutConfig:input_type -> io.defang.v1.PutConfigRequest - 44, // 92: io.defang.v1.FabricController.DeleteConfigs:input_type -> io.defang.v1.DeleteConfigsRequest - 45, // 93: io.defang.v1.FabricController.ListConfigs:input_type -> io.defang.v1.ListConfigsRequest - 48, // 94: io.defang.v1.FabricController.PutDeployment:input_type -> io.defang.v1.PutDeploymentRequest - 49, // 95: io.defang.v1.FabricController.ListDeployments:input_type -> io.defang.v1.ListDeploymentsRequest - 34, // 96: io.defang.v1.FabricController.CreateUploadURL:input_type -> io.defang.v1.UploadURLRequest - 79, // 97: io.defang.v1.FabricController.DelegateSubdomainZone:input_type -> io.defang.v1.DelegateSubdomainZoneRequest - 81, // 98: io.defang.v1.FabricController.DeleteSubdomainZone:input_type -> io.defang.v1.DeleteSubdomainZoneRequest - 82, // 99: io.defang.v1.FabricController.GetDelegateSubdomainZone:input_type -> io.defang.v1.GetDelegateSubdomainZoneRequest - 83, // 100: io.defang.v1.FabricController.SetOptions:input_type -> io.defang.v1.SetOptionsRequest - 95, // 101: io.defang.v1.FabricController.WhoAmI:input_type -> google.protobuf.Empty - 22, // 102: io.defang.v1.FabricController.Track:input_type -> io.defang.v1.TrackRequest - 95, // 103: io.defang.v1.FabricController.DeleteMe:input_type -> google.protobuf.Empty - 15, // 104: io.defang.v1.FabricController.VerifyDNSSetup:input_type -> io.defang.v1.VerifyDNSSetupRequest - 12, // 105: io.defang.v1.FabricController.GetSelectedProvider:input_type -> io.defang.v1.GetSelectedProviderRequest - 14, // 106: io.defang.v1.FabricController.SetSelectedProvider:input_type -> io.defang.v1.SetSelectedProviderRequest - 23, // 107: io.defang.v1.FabricController.CanIUse:input_type -> io.defang.v1.CanIUseRequest - 85, // 108: io.defang.v1.FabricController.Estimate:input_type -> io.defang.v1.EstimateRequest - 88, // 109: io.defang.v1.FabricController.Preview:input_type -> io.defang.v1.PreviewRequest - 53, // 110: io.defang.v1.FabricController.GetStatus:output_type -> io.defang.v1.Status - 54, // 111: io.defang.v1.FabricController.GetVersion:output_type -> io.defang.v1.Version - 52, // 112: io.defang.v1.FabricController.Token:output_type -> io.defang.v1.TokenResponse - 95, // 113: io.defang.v1.FabricController.RevokeToken:output_type -> google.protobuf.Empty - 57, // 114: io.defang.v1.FabricController.Tail:output_type -> io.defang.v1.TailResponse - 36, // 115: io.defang.v1.FabricController.Update:output_type -> io.defang.v1.ServiceInfo - 26, // 116: io.defang.v1.FabricController.Deploy:output_type -> io.defang.v1.DeployResponse - 36, // 117: io.defang.v1.FabricController.Get:output_type -> io.defang.v1.ServiceInfo - 28, // 118: io.defang.v1.FabricController.Delete:output_type -> io.defang.v1.DeleteResponse - 17, // 119: io.defang.v1.FabricController.Destroy:output_type -> io.defang.v1.DestroyResponse - 95, // 120: io.defang.v1.FabricController.Publish:output_type -> google.protobuf.Empty - 77, // 121: io.defang.v1.FabricController.Subscribe:output_type -> io.defang.v1.SubscribeResponse - 58, // 122: io.defang.v1.FabricController.GetServices:output_type -> io.defang.v1.GetServicesResponse - 31, // 123: io.defang.v1.FabricController.GenerateFiles:output_type -> io.defang.v1.GenerateFilesResponse - 32, // 124: io.defang.v1.FabricController.StartGenerate:output_type -> io.defang.v1.StartGenerateResponse - 31, // 125: io.defang.v1.FabricController.GenerateStatus:output_type -> io.defang.v1.GenerateFilesResponse - 19, // 126: io.defang.v1.FabricController.Debug:output_type -> io.defang.v1.DebugResponse - 95, // 127: io.defang.v1.FabricController.SignEULA:output_type -> google.protobuf.Empty - 95, // 128: io.defang.v1.FabricController.CheckToS:output_type -> google.protobuf.Empty - 95, // 129: io.defang.v1.FabricController.PutSecret:output_type -> google.protobuf.Empty - 95, // 130: io.defang.v1.FabricController.DeleteSecrets:output_type -> google.protobuf.Empty - 37, // 131: io.defang.v1.FabricController.ListSecrets:output_type -> io.defang.v1.Secrets - 43, // 132: io.defang.v1.FabricController.GetConfigs:output_type -> io.defang.v1.GetConfigsResponse - 95, // 133: io.defang.v1.FabricController.PutConfig:output_type -> google.protobuf.Empty - 95, // 134: io.defang.v1.FabricController.DeleteConfigs:output_type -> google.protobuf.Empty - 46, // 135: io.defang.v1.FabricController.ListConfigs:output_type -> io.defang.v1.ListConfigsResponse - 95, // 136: io.defang.v1.FabricController.PutDeployment:output_type -> google.protobuf.Empty - 50, // 137: io.defang.v1.FabricController.ListDeployments:output_type -> io.defang.v1.ListDeploymentsResponse - 35, // 138: io.defang.v1.FabricController.CreateUploadURL:output_type -> io.defang.v1.UploadURLResponse - 80, // 139: io.defang.v1.FabricController.DelegateSubdomainZone:output_type -> io.defang.v1.DelegateSubdomainZoneResponse - 95, // 140: io.defang.v1.FabricController.DeleteSubdomainZone:output_type -> google.protobuf.Empty - 80, // 141: io.defang.v1.FabricController.GetDelegateSubdomainZone:output_type -> io.defang.v1.DelegateSubdomainZoneResponse - 95, // 142: io.defang.v1.FabricController.SetOptions:output_type -> google.protobuf.Empty - 84, // 143: io.defang.v1.FabricController.WhoAmI:output_type -> io.defang.v1.WhoAmIResponse - 95, // 144: io.defang.v1.FabricController.Track:output_type -> google.protobuf.Empty - 95, // 145: io.defang.v1.FabricController.DeleteMe:output_type -> google.protobuf.Empty - 95, // 146: io.defang.v1.FabricController.VerifyDNSSetup:output_type -> google.protobuf.Empty - 13, // 147: io.defang.v1.FabricController.GetSelectedProvider:output_type -> io.defang.v1.GetSelectedProviderResponse - 95, // 148: io.defang.v1.FabricController.SetSelectedProvider:output_type -> google.protobuf.Empty - 24, // 149: io.defang.v1.FabricController.CanIUse:output_type -> io.defang.v1.CanIUseResponse - 87, // 150: io.defang.v1.FabricController.Estimate:output_type -> io.defang.v1.EstimateResponse - 89, // 151: io.defang.v1.FabricController.Preview:output_type -> io.defang.v1.PreviewResponse - 110, // [110:152] is the sub-list for method output_type - 68, // [68:110] is the sub-list for method input_type - 68, // [68:68] is the sub-list for extension type_name - 68, // [68:68] is the sub-list for extension extendee - 0, // [0:68] is the sub-list for field type_name + 0, // 0: io.defang.v1.GetSelectedProviderResponse.provider:type_name -> io.defang.v1.Provider + 0, // 1: io.defang.v1.SetSelectedProviderRequest.provider:type_name -> io.defang.v1.Provider + 26, // 2: io.defang.v1.DebugRequest.files:type_name -> io.defang.v1.File + 75, // 3: io.defang.v1.DebugRequest.since:type_name -> google.protobuf.Timestamp + 75, // 4: io.defang.v1.DebugRequest.until:type_name -> google.protobuf.Timestamp + 16, // 5: io.defang.v1.DebugResponse.issues:type_name -> io.defang.v1.Issue + 17, // 6: io.defang.v1.Issue.code_changes:type_name -> io.defang.v1.CodeChange + 74, // 7: io.defang.v1.TrackRequest.properties:type_name -> io.defang.v1.TrackRequest.PropertiesEntry + 0, // 8: io.defang.v1.CanIUseRequest.provider:type_name -> io.defang.v1.Provider + 1, // 9: io.defang.v1.DeployRequest.mode:type_name -> io.defang.v1.DeploymentMode + 32, // 10: io.defang.v1.DeployResponse.services:type_name -> io.defang.v1.ServiceInfo + 26, // 11: io.defang.v1.GenerateFilesResponse.files:type_name -> io.defang.v1.File + 57, // 12: io.defang.v1.ServiceInfo.service:type_name -> io.defang.v1.Service + 75, // 13: io.defang.v1.ServiceInfo.created_at:type_name -> google.protobuf.Timestamp + 75, // 14: io.defang.v1.ServiceInfo.updated_at:type_name -> google.protobuf.Timestamp + 2, // 15: io.defang.v1.ServiceInfo.state:type_name -> io.defang.v1.ServiceState + 3, // 16: io.defang.v1.Config.type:type_name -> io.defang.v1.ConfigType + 3, // 17: io.defang.v1.PutConfigRequest.type:type_name -> io.defang.v1.ConfigType + 36, // 18: io.defang.v1.GetConfigsRequest.configs:type_name -> io.defang.v1.ConfigKey + 35, // 19: io.defang.v1.GetConfigsResponse.configs:type_name -> io.defang.v1.Config + 36, // 20: io.defang.v1.DeleteConfigsRequest.configs:type_name -> io.defang.v1.ConfigKey + 36, // 21: io.defang.v1.ListConfigsResponse.configs:type_name -> io.defang.v1.ConfigKey + 75, // 22: io.defang.v1.Deployment.timestamp:type_name -> google.protobuf.Timestamp + 5, // 23: io.defang.v1.Deployment.action:type_name -> io.defang.v1.DeploymentAction + 0, // 24: io.defang.v1.Deployment.provider:type_name -> io.defang.v1.Provider + 43, // 25: io.defang.v1.PutDeploymentRequest.deployment:type_name -> io.defang.v1.Deployment + 4, // 26: io.defang.v1.ListDeploymentsRequest.type:type_name -> io.defang.v1.DeploymentType + 43, // 27: io.defang.v1.ListDeploymentsResponse.deployments:type_name -> io.defang.v1.Deployment + 75, // 28: io.defang.v1.TailRequest.since:type_name -> google.protobuf.Timestamp + 75, // 29: io.defang.v1.TailRequest.until:type_name -> google.protobuf.Timestamp + 75, // 30: io.defang.v1.LogEntry.timestamp:type_name -> google.protobuf.Timestamp + 52, // 31: io.defang.v1.TailResponse.entries:type_name -> io.defang.v1.LogEntry + 32, // 32: io.defang.v1.GetServicesResponse.services:type_name -> io.defang.v1.ServiceInfo + 75, // 33: io.defang.v1.GetServicesResponse.expires_at:type_name -> google.protobuf.Timestamp + 32, // 34: io.defang.v1.ProjectUpdate.services:type_name -> io.defang.v1.ServiceInfo + 1, // 35: io.defang.v1.ProjectUpdate.mode:type_name -> io.defang.v1.DeploymentMode + 0, // 36: io.defang.v1.ProjectUpdate.provider:type_name -> io.defang.v1.Provider + 75, // 37: io.defang.v1.Event.time:type_name -> google.protobuf.Timestamp + 58, // 38: io.defang.v1.PublishRequest.event:type_name -> io.defang.v1.Event + 32, // 39: io.defang.v1.SubscribeResponse.service:type_name -> io.defang.v1.ServiceInfo + 2, // 40: io.defang.v1.SubscribeResponse.state:type_name -> io.defang.v1.ServiceState + 6, // 41: io.defang.v1.WhoAmIResponse.tier:type_name -> io.defang.v1.SubscriptionTier + 0, // 42: io.defang.v1.EstimateRequest.provider:type_name -> io.defang.v1.Provider + 76, // 43: io.defang.v1.EstimateLineItem.cost:type_name -> google.type.Money + 0, // 44: io.defang.v1.EstimateResponse.provider:type_name -> io.defang.v1.Provider + 76, // 45: io.defang.v1.EstimateResponse.subtotal:type_name -> google.type.Money + 70, // 46: io.defang.v1.EstimateResponse.line_items:type_name -> io.defang.v1.EstimateLineItem + 0, // 47: io.defang.v1.PreviewRequest.provider:type_name -> io.defang.v1.Provider + 1, // 48: io.defang.v1.PreviewRequest.mode:type_name -> io.defang.v1.DeploymentMode + 77, // 49: io.defang.v1.FabricController.GetStatus:input_type -> google.protobuf.Empty + 77, // 50: io.defang.v1.FabricController.GetVersion:input_type -> google.protobuf.Empty + 47, // 51: io.defang.v1.FabricController.Token:input_type -> io.defang.v1.TokenRequest + 77, // 52: io.defang.v1.FabricController.RevokeToken:input_type -> google.protobuf.Empty + 51, // 53: io.defang.v1.FabricController.Tail:input_type -> io.defang.v1.TailRequest + 57, // 54: io.defang.v1.FabricController.Update:input_type -> io.defang.v1.Service + 21, // 55: io.defang.v1.FabricController.Deploy:input_type -> io.defang.v1.DeployRequest + 56, // 56: io.defang.v1.FabricController.Get:input_type -> io.defang.v1.GetRequest + 23, // 57: io.defang.v1.FabricController.Delete:input_type -> io.defang.v1.DeleteRequest + 12, // 58: io.defang.v1.FabricController.Destroy:input_type -> io.defang.v1.DestroyRequest + 59, // 59: io.defang.v1.FabricController.Publish:input_type -> io.defang.v1.PublishRequest + 60, // 60: io.defang.v1.FabricController.Subscribe:input_type -> io.defang.v1.SubscribeRequest + 62, // 61: io.defang.v1.FabricController.GetServices:input_type -> io.defang.v1.GetServicesRequest + 25, // 62: io.defang.v1.FabricController.GenerateFiles:input_type -> io.defang.v1.GenerateFilesRequest + 25, // 63: io.defang.v1.FabricController.StartGenerate:input_type -> io.defang.v1.GenerateFilesRequest + 29, // 64: io.defang.v1.FabricController.GenerateStatus:input_type -> io.defang.v1.GenerateStatusRequest + 14, // 65: io.defang.v1.FabricController.Debug:input_type -> io.defang.v1.DebugRequest + 77, // 66: io.defang.v1.FabricController.SignEULA:input_type -> google.protobuf.Empty + 77, // 67: io.defang.v1.FabricController.CheckToS:input_type -> google.protobuf.Empty + 37, // 68: io.defang.v1.FabricController.PutSecret:input_type -> io.defang.v1.PutConfigRequest + 33, // 69: io.defang.v1.FabricController.DeleteSecrets:input_type -> io.defang.v1.Secrets + 41, // 70: io.defang.v1.FabricController.ListSecrets:input_type -> io.defang.v1.ListConfigsRequest + 38, // 71: io.defang.v1.FabricController.GetConfigs:input_type -> io.defang.v1.GetConfigsRequest + 37, // 72: io.defang.v1.FabricController.PutConfig:input_type -> io.defang.v1.PutConfigRequest + 40, // 73: io.defang.v1.FabricController.DeleteConfigs:input_type -> io.defang.v1.DeleteConfigsRequest + 41, // 74: io.defang.v1.FabricController.ListConfigs:input_type -> io.defang.v1.ListConfigsRequest + 44, // 75: io.defang.v1.FabricController.PutDeployment:input_type -> io.defang.v1.PutDeploymentRequest + 45, // 76: io.defang.v1.FabricController.ListDeployments:input_type -> io.defang.v1.ListDeploymentsRequest + 30, // 77: io.defang.v1.FabricController.CreateUploadURL:input_type -> io.defang.v1.UploadURLRequest + 63, // 78: io.defang.v1.FabricController.DelegateSubdomainZone:input_type -> io.defang.v1.DelegateSubdomainZoneRequest + 65, // 79: io.defang.v1.FabricController.DeleteSubdomainZone:input_type -> io.defang.v1.DeleteSubdomainZoneRequest + 66, // 80: io.defang.v1.FabricController.GetDelegateSubdomainZone:input_type -> io.defang.v1.GetDelegateSubdomainZoneRequest + 67, // 81: io.defang.v1.FabricController.SetOptions:input_type -> io.defang.v1.SetOptionsRequest + 77, // 82: io.defang.v1.FabricController.WhoAmI:input_type -> google.protobuf.Empty + 18, // 83: io.defang.v1.FabricController.Track:input_type -> io.defang.v1.TrackRequest + 77, // 84: io.defang.v1.FabricController.DeleteMe:input_type -> google.protobuf.Empty + 11, // 85: io.defang.v1.FabricController.VerifyDNSSetup:input_type -> io.defang.v1.VerifyDNSSetupRequest + 8, // 86: io.defang.v1.FabricController.GetSelectedProvider:input_type -> io.defang.v1.GetSelectedProviderRequest + 10, // 87: io.defang.v1.FabricController.SetSelectedProvider:input_type -> io.defang.v1.SetSelectedProviderRequest + 19, // 88: io.defang.v1.FabricController.CanIUse:input_type -> io.defang.v1.CanIUseRequest + 69, // 89: io.defang.v1.FabricController.Estimate:input_type -> io.defang.v1.EstimateRequest + 72, // 90: io.defang.v1.FabricController.Preview:input_type -> io.defang.v1.PreviewRequest + 49, // 91: io.defang.v1.FabricController.GetStatus:output_type -> io.defang.v1.Status + 50, // 92: io.defang.v1.FabricController.GetVersion:output_type -> io.defang.v1.Version + 48, // 93: io.defang.v1.FabricController.Token:output_type -> io.defang.v1.TokenResponse + 77, // 94: io.defang.v1.FabricController.RevokeToken:output_type -> google.protobuf.Empty + 53, // 95: io.defang.v1.FabricController.Tail:output_type -> io.defang.v1.TailResponse + 32, // 96: io.defang.v1.FabricController.Update:output_type -> io.defang.v1.ServiceInfo + 22, // 97: io.defang.v1.FabricController.Deploy:output_type -> io.defang.v1.DeployResponse + 32, // 98: io.defang.v1.FabricController.Get:output_type -> io.defang.v1.ServiceInfo + 24, // 99: io.defang.v1.FabricController.Delete:output_type -> io.defang.v1.DeleteResponse + 13, // 100: io.defang.v1.FabricController.Destroy:output_type -> io.defang.v1.DestroyResponse + 77, // 101: io.defang.v1.FabricController.Publish:output_type -> google.protobuf.Empty + 61, // 102: io.defang.v1.FabricController.Subscribe:output_type -> io.defang.v1.SubscribeResponse + 54, // 103: io.defang.v1.FabricController.GetServices:output_type -> io.defang.v1.GetServicesResponse + 27, // 104: io.defang.v1.FabricController.GenerateFiles:output_type -> io.defang.v1.GenerateFilesResponse + 28, // 105: io.defang.v1.FabricController.StartGenerate:output_type -> io.defang.v1.StartGenerateResponse + 27, // 106: io.defang.v1.FabricController.GenerateStatus:output_type -> io.defang.v1.GenerateFilesResponse + 15, // 107: io.defang.v1.FabricController.Debug:output_type -> io.defang.v1.DebugResponse + 77, // 108: io.defang.v1.FabricController.SignEULA:output_type -> google.protobuf.Empty + 77, // 109: io.defang.v1.FabricController.CheckToS:output_type -> google.protobuf.Empty + 77, // 110: io.defang.v1.FabricController.PutSecret:output_type -> google.protobuf.Empty + 77, // 111: io.defang.v1.FabricController.DeleteSecrets:output_type -> google.protobuf.Empty + 33, // 112: io.defang.v1.FabricController.ListSecrets:output_type -> io.defang.v1.Secrets + 39, // 113: io.defang.v1.FabricController.GetConfigs:output_type -> io.defang.v1.GetConfigsResponse + 77, // 114: io.defang.v1.FabricController.PutConfig:output_type -> google.protobuf.Empty + 77, // 115: io.defang.v1.FabricController.DeleteConfigs:output_type -> google.protobuf.Empty + 42, // 116: io.defang.v1.FabricController.ListConfigs:output_type -> io.defang.v1.ListConfigsResponse + 77, // 117: io.defang.v1.FabricController.PutDeployment:output_type -> google.protobuf.Empty + 46, // 118: io.defang.v1.FabricController.ListDeployments:output_type -> io.defang.v1.ListDeploymentsResponse + 31, // 119: io.defang.v1.FabricController.CreateUploadURL:output_type -> io.defang.v1.UploadURLResponse + 64, // 120: io.defang.v1.FabricController.DelegateSubdomainZone:output_type -> io.defang.v1.DelegateSubdomainZoneResponse + 77, // 121: io.defang.v1.FabricController.DeleteSubdomainZone:output_type -> google.protobuf.Empty + 64, // 122: io.defang.v1.FabricController.GetDelegateSubdomainZone:output_type -> io.defang.v1.DelegateSubdomainZoneResponse + 77, // 123: io.defang.v1.FabricController.SetOptions:output_type -> google.protobuf.Empty + 68, // 124: io.defang.v1.FabricController.WhoAmI:output_type -> io.defang.v1.WhoAmIResponse + 77, // 125: io.defang.v1.FabricController.Track:output_type -> google.protobuf.Empty + 77, // 126: io.defang.v1.FabricController.DeleteMe:output_type -> google.protobuf.Empty + 77, // 127: io.defang.v1.FabricController.VerifyDNSSetup:output_type -> google.protobuf.Empty + 9, // 128: io.defang.v1.FabricController.GetSelectedProvider:output_type -> io.defang.v1.GetSelectedProviderResponse + 77, // 129: io.defang.v1.FabricController.SetSelectedProvider:output_type -> google.protobuf.Empty + 20, // 130: io.defang.v1.FabricController.CanIUse:output_type -> io.defang.v1.CanIUseResponse + 71, // 131: io.defang.v1.FabricController.Estimate:output_type -> io.defang.v1.EstimateResponse + 73, // 132: io.defang.v1.FabricController.Preview:output_type -> io.defang.v1.PreviewResponse + 91, // [91:133] is the sub-list for method output_type + 49, // [49:91] is the sub-list for method input_type + 49, // [49:49] is the sub-list for extension type_name + 49, // [49:49] is the sub-list for extension extendee + 0, // [0:49] is the sub-list for field type_name } func init() { file_io_defang_v1_fabric_proto_init() } @@ -6847,8 +5601,8 @@ func file_io_defang_v1_fabric_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_io_defang_v1_fabric_proto_rawDesc, - NumEnums: 12, - NumMessages: 81, + NumEnums: 8, + NumMessages: 67, NumExtensions: 0, NumServices: 1, }, diff --git a/src/protos/io/defang/v1/fabric.proto b/src/protos/io/defang/v1/fabric.proto index 178750ebb..f4df42c91 100644 --- a/src/protos/io/defang/v1/fabric.proto +++ b/src/protos/io/defang/v1/fabric.proto @@ -15,7 +15,7 @@ service FabricController { }; // public rpc GetVersion(google.protobuf.Empty) returns (Version) { option idempotency_level = NO_SIDE_EFFECTS; - }; // public + }; // public rpc Token(TokenRequest) returns (TokenResponse); // public rpc RevokeToken(google.protobuf.Empty) returns (google.protobuf.Empty); @@ -227,8 +227,7 @@ message CanIUseResponse { } message DeployRequest { - repeated Service services = 1 - [ deprecated = true ]; // deprecated; use compose + reserved 1; // was: services string project = 2 [ deprecated = true ]; // deprecated; use compose.name DeploymentMode mode = 3; bytes compose = 4; // yaml (or json) @@ -255,8 +254,7 @@ message GenerateFilesRequest { string language = 2; bool agree_tos = 3; bool training_opt_out = 4; // only valid for Pro users - string model_id = 5; // only valid for Pro users - + string model_id = 5; // only valid for Pro users } message File { @@ -320,6 +318,8 @@ message ServiceInfo { string domainname = 16; // domain name for the service string lb_dns_name = 17; // fully qualified domain name for the load-balancer bool allow_scaling = 18; // true if service is allowed to autoscale + string healthcheck = 19; // healthcheck path + string name = 20; // name of the service } message Secrets { @@ -399,7 +399,7 @@ message PutDeploymentRequest { Deployment deployment = 1; } message ListDeploymentsRequest { string project = 1; DeploymentType type = 2; // active or all - uint32 limit = 3; // number of deployments to return + uint32 limit = 3; // number of deployments to return } message ListDeploymentsResponse { repeated Deployment deployments = 1; } @@ -479,20 +479,8 @@ message ProjectUpdate { DeploymentMode mode = 6; Provider provider = 7; uint32 project_outputs_version = 8; - bytes project_outputs = 9; // JSON serialization of pulumi outputs. schema versioned using project_outputs_version -} - -enum Platform { - option deprecated = true; // still used by pulumi-defang provider in state files - LINUX_AMD64 = 0; - LINUX_ARM64 = 1; - LINUX_ANY = 2; -} - -message ServiceID { - option deprecated = true; // still used by pulumi-defang provider in state files - string name = 1; - string project = 2; + bytes project_outputs = 9; // JSON serialization of pulumi outputs. schema + // versioned using project_outputs_version } message GetRequest { // was ServiceID @@ -500,136 +488,28 @@ message GetRequest { // was ServiceID string project = 2; } -message Device { - option deprecated = true; // still used by pulumi-defang provider in state files - repeated string capabilities = 1; // "gpu", "tpu", etc. - string driver = 2; // "nvidia", "amd", etc. - uint32 count = 3; // number of devices to reserve -} - -message Resource { - option deprecated = true; // still used by pulumi-defang provider in state files - float memory = 1; // in MiB - float cpus = 2; // fractional vCPUs - repeated Device devices = 3; // devices & capabilities -} - -message Resources { - option deprecated = true; // still used by pulumi-defang provider in state files - Resource reservations = 1; // requested resources - - // Resource limits = 2; // hard limits -} - -message Deploy { - option deprecated = true; // still used by pulumi-defang provider in state files - uint32 replicas = 1; // number of initial replicas - Resources resources = 2; // reservations and limits - - // Placement placement = 3; - // EndpointMode endpoint_mode - // Mode mode -} - -enum Protocol { - option deprecated = true; // still used by pulumi-defang provider in state files - ANY = 0; // unspecified means any protocol - UDP = 1; - TCP = 2; - HTTP = 3; - HTTP2 = 4; - GRPC = 5; // HTTP/2 with gRPC health checks -} - -enum Mode { - option deprecated = true; // still used by pulumi-defang provider in state files - HOST = 0; // no load-balancer; suitable for internal services and functions - INGRESS = 1; // with load-balancer; suitable for public services -} - -message Port { - option deprecated = true; // still used by pulumi-defang provider in state files - uint32 target = 1; - Protocol protocol = 2; - Mode mode = 3; // load-balanced (ingress) or not (host) - - // string host_ip "127.0.0.1" - // Range published "8080" -} - -message Secret { - option deprecated = true; // still used by pulumi-defang provider in state files - string source = 1; // name of the secret - // string target = 2; -} - -message Build { - option deprecated = true; // still used by pulumi-defang provider in state files - string context = 1; // path or URL to the build context - string dockerfile = 2; // path to the Dockerfile - map args = 3; // build-time variables - float shm_size = 4; // in MiB - string target = 5; -} - -message HealthCheck { - option deprecated = true; // still used by pulumi-defang provider in state files - repeated string test = 1; - uint32 interval = 2; // in seconds - uint32 timeout = 3; // in seconds; must be less than interval - uint32 retries = 4; -} - -enum Network { - option deprecated = true; // still used by pulumi-defang provider in state files - UNSPECIFIED = 0; // was: internal=false - PRIVATE = 1; // was: internal=true - PUBLIC = 2; -} - message Service { - option deprecated = true; // still used by pulumi-defang provider in state files - string name = 1; - string image = 2; - Platform platform = 3; - bool internal = 4 [ deprecated = true ]; // deprecated: use networks - Deploy deploy = 5; - repeated Port ports = 6; - map environment = 7; - Build build = 8; - repeated Secret secrets = 9; // FIXME: these are actually env vars - HealthCheck healthcheck = 10; - repeated string command = 11; - string domainname = 12; - bool init = 13; - string dns_role = 14; // x-defang-dns-role: role arn used to access route53 to - // create dns records - StaticFiles static_files = 15; // x-defang-static-files: use a managed CDN - Network networks = 16; // currently only 1 network is supported - repeated string aliases = 17; - Redis redis = 18; // x-defang-redis: use a managed redis - string project = 20; // defaults to tenant ID -} - -message StaticFiles { - option deprecated = true; // still used by pulumi-defang provider in state files - string folder = 1; - repeated string redirects = 2; -} - -message Redis { option deprecated = true; } - -// TODO: internal message; move to a separate proto file; was Event -message DeployEvent { - DeploymentMode mode = 1; - string type = 2; // required - string source = 3; - string id = 4; // etag - string datacontenttype = 5; - string dataschema = 6; - string subject = 7; // tenant|stack; also used as SQS group ID - google.protobuf.Timestamp time = 8; - bytes data = 9; + option deprecated = + true; // still used by pulumi-defang provider in state files + string name = 1 [ deprecated = true ]; // use ServiceInfo.name + reserved 2; // was: string image + reserved 3; // was: Platform platform + reserved 4; // was: bool internal + reserved 5; // was: Deploy deploy + reserved 6; // was: repeated Port ports + reserved 7; // was: map environment + reserved 8; // was: Build build + reserved 9; // was: repeated Secret secrets + reserved 10; // was: HealthCheck healthcheck + reserved 11; // was: repeated string command + reserved 12; // was: string domainname + reserved 13; // was: bool init + reserved 14; // was: string dns_role + reserved 15; // was: StaticFiles static_files + reserved 16; // was: Network networks + reserved 17; // was: repeated string aliases + reserved 18; // was: Redis redis + reserved 20; // was: string project } message Event { @@ -669,13 +549,9 @@ message DelegateSubdomainZoneRequest { message DelegateSubdomainZoneResponse { string zone = 1; } -message DeleteSubdomainZoneRequest { - string project = 1; -} +message DeleteSubdomainZoneRequest { string project = 1; } -message GetDelegateSubdomainZoneRequest { - string project = 1; -} +message GetDelegateSubdomainZoneRequest { string project = 1; } enum SubscriptionTier { SUBSCRIPTION_TIER_UNSPECIFIED = 0; @@ -729,6 +605,4 @@ message PreviewRequest { string project_name = 6; } -message PreviewResponse { - string etag = 1; -} +message PreviewResponse { string etag = 1; }