From 180881c8d2c0e427a70b09f5e52cbafe3edb6110 Mon Sep 17 00:00:00 2001 From: Andrew Watkins Date: Fri, 8 May 2026 06:08:53 -0500 Subject: [PATCH 1/3] feat(ci): add diagnose command --- pkg/api/ci.go | 10 + pkg/api/ci_test.go | 40 + pkg/cmd/ci/ci.go | 1 + pkg/cmd/ci/ci_test.go | 1 + pkg/cmd/ci/diagnose.go | 796 ++++ pkg/cmd/ci/diagnose_test.go | 562 +++ pkg/proto/depot/ci/v1/ci.pb.go | 4005 ++++++++++++----- .../depot/ci/v1/civ1connect/ci.connect.go | 29 + proto/depot/ci/v1/ci.proto | 168 + 9 files changed, 4593 insertions(+), 1019 deletions(-) create mode 100644 pkg/cmd/ci/diagnose.go create mode 100644 pkg/cmd/ci/diagnose_test.go diff --git a/pkg/api/ci.go b/pkg/api/ci.go index 340d34bb..974b1c1e 100644 --- a/pkg/api/ci.go +++ b/pkg/api/ci.go @@ -42,6 +42,16 @@ func CIGetRunStatus(ctx context.Context, token, orgID, runID string) (*civ1.GetR return resp.Msg, nil } +// CIGetFailureDiagnosis returns a bounded diagnosis for a run, workflow, job, or attempt. +func CIGetFailureDiagnosis(ctx context.Context, token, orgID string, req *civ1.GetFailureDiagnosisRequest) (*civ1.FailureDiagnosis, error) { + client := newCIServiceClient() + resp, err := client.GetFailureDiagnosis(ctx, WithAuthenticationAndOrg(connect.NewRequest(req), token, orgID)) + if err != nil { + return nil, err + } + return resp.Msg, nil +} + // CIGetWorkflow returns curated run/workflow/execution/job/attempt metadata for a single workflow. func CIGetWorkflow(ctx context.Context, token, orgID, workflowID string) (*civ1.GetWorkflowResponse, error) { client := newCIServiceClient() diff --git a/pkg/api/ci_test.go b/pkg/api/ci_test.go index abddef7a..842b79e6 100644 --- a/pkg/api/ci_test.go +++ b/pkg/api/ci_test.go @@ -21,6 +21,7 @@ import ( ) type ciServiceTestHandler struct { + civ1connect.UnimplementedCIServiceHandler t *testing.T } @@ -72,6 +73,25 @@ func (h ciServiceTestHandler) GetRunStatus(context.Context, *connect.Request[civ return nil, connect.NewError(connect.CodeUnimplemented, nil) } +func (h ciServiceTestHandler) GetFailureDiagnosis(_ context.Context, req *connect.Request[civ1.GetFailureDiagnosisRequest]) (*connect.Response[civ1.FailureDiagnosis], error) { + assertAuthAndOrg(h.t, req.Header()) + if req.Msg.TargetId != "job-123" { + h.t.Fatalf("TargetId = %q, want job-123", req.Msg.TargetId) + } + if req.Msg.TargetType != civ1.FailureDiagnosisTargetType_FAILURE_DIAGNOSIS_TARGET_TYPE_JOB { + h.t.Fatalf("TargetType = %v, want job", req.Msg.TargetType) + } + return connect.NewResponse(&civ1.FailureDiagnosis{ + OrgId: "org-123", + Target: &civ1.FailureDiagnosisTarget{ + TargetId: req.Msg.TargetId, + TargetType: req.Msg.TargetType, + Status: "failed", + }, + State: civ1.FailureDiagnosisState_FAILURE_DIAGNOSIS_STATE_FOCUSED_FAILURE, + }), nil +} + func (h ciServiceTestHandler) GetWorkflow(_ context.Context, req *connect.Request[civ1.GetWorkflowRequest]) (*connect.Response[civ1.GetWorkflowResponse], error) { assertAuthAndOrg(h.t, req.Header()) if req.Msg.WorkflowId != "workflow-123" { @@ -150,6 +170,26 @@ func TestCIGetRunWrapper(t *testing.T) { }) } +func TestCIGetFailureDiagnosisWrapper(t *testing.T) { + withTestCIService(t, func() { + resp, err := CIGetFailureDiagnosis( + context.Background(), + "token-123", + "org-123", + &civ1.GetFailureDiagnosisRequest{ + TargetId: "job-123", + TargetType: civ1.FailureDiagnosisTargetType_FAILURE_DIAGNOSIS_TARGET_TYPE_JOB, + }, + ) + if err != nil { + t.Fatalf("CIGetFailureDiagnosis returned error: %v", err) + } + if resp.GetTarget().GetTargetId() != "job-123" || resp.GetState() != civ1.FailureDiagnosisState_FAILURE_DIAGNOSIS_STATE_FOCUSED_FAILURE { + t.Fatalf("unexpected response: %+v", resp) + } + }) +} + func TestCICancelRunWrapper(t *testing.T) { withTestCIService(t, func() { resp, err := CICancelRun(context.Background(), "token-123", "org-123", "run-123") diff --git a/pkg/cmd/ci/ci.go b/pkg/cmd/ci/ci.go index 2d4c1fdc..f2c9c9ac 100644 --- a/pkg/cmd/ci/ci.go +++ b/pkg/cmd/ci/ci.go @@ -13,6 +13,7 @@ func NewCmdCI() *cobra.Command { } cmd.AddCommand(NewCmdCancel()) + cmd.AddCommand(NewCmdDiagnose()) cmd.AddCommand(NewCmdDispatch()) cmd.AddCommand(NewCmdLogs()) cmd.AddCommand(NewCmdMetrics()) diff --git a/pkg/cmd/ci/ci_test.go b/pkg/cmd/ci/ci_test.go index 9d20e30a..eb789f1b 100644 --- a/pkg/cmd/ci/ci_test.go +++ b/pkg/cmd/ci/ci_test.go @@ -14,6 +14,7 @@ func TestCICommandRegistration(t *testing.T) { // inspection / interactive "run", "status", + "diagnose", "logs", "summary", "ssh", diff --git a/pkg/cmd/ci/diagnose.go b/pkg/cmd/ci/diagnose.go new file mode 100644 index 00000000..a4bc2bae --- /dev/null +++ b/pkg/cmd/ci/diagnose.go @@ -0,0 +1,796 @@ +package ci + +import ( + "fmt" + "io" + "strings" + "unicode" + + "github.com/depot/cli/pkg/api" + "github.com/depot/cli/pkg/config" + "github.com/depot/cli/pkg/helpers" + civ1 "github.com/depot/cli/pkg/proto/depot/ci/v1" + "github.com/spf13/cobra" +) + +var ciDiagnose = api.CIGetFailureDiagnosis + +func NewCmdDiagnose() *cobra.Command { + var ( + orgID string + token string + output string + targetType string + ) + + cmd := &cobra.Command{ + Use: "diagnose ", + Short: "Diagnose a failed CI run, workflow, job, or attempt", + Long: "Diagnose a failed CI run, workflow, job, or attempt using bounded stored failure context.", + Example: ` depot ci diagnose + depot ci diagnose + depot ci diagnose --output json + depot ci diagnose `, + RunE: func(cmd *cobra.Command, args []string) error { + if err := validateTextOrJSONOutput(output); err != nil { + return err + } + diagnosisTargetType, err := parseDiagnosisTargetType(targetType) + if err != nil { + return err + } + if len(args) == 0 { + if outputIsJSON(output) { + cmd.SilenceUsage = true + return fmt.Errorf("expected exactly one run, workflow, job, or attempt ID") + } + return cmd.Help() + } + if len(args) > 1 { + return fmt.Errorf("expected exactly one run, workflow, job, or attempt ID") + } + + ctx := cmd.Context() + id := args[0] + + if orgID == "" { + orgID = config.GetCurrentOrganization() + } + + tokenVal, err := helpers.ResolveOrgAuth(ctx, token) + if err != nil { + return err + } + if tokenVal == "" { + return fmt.Errorf("missing API token, please run `depot login`") + } + + resp, err := ciDiagnose(ctx, tokenVal, orgID, &civ1.GetFailureDiagnosisRequest{ + TargetId: id, + TargetType: diagnosisTargetType, + }) + if err != nil { + return fmt.Errorf("failed to diagnose CI target: %w", err) + } + + renderer := diagnosisCommandRenderer{} + if cmd.Flags().Changed("org") { + renderer.orgID = orgID + } + + if outputIsJSON(output) { + return writeJSON(buildDiagnoseJSON(resp, renderer)) + } + printDiagnoseResponse(cmd.OutOrStdout(), resp, renderer) + return nil + }, + } + + cmd.Flags().StringVar(&orgID, "org", "", "Organization ID (required when user is a member of multiple organizations)") + cmd.Flags().StringVar(&token, "token", "", "Depot API token") + cmd.Flags().StringVarP(&output, "output", "o", "", "Output format (text, json)") + cmd.Flags().StringVar(&targetType, "type", "", "Target type (run, workflow, job, attempt)") + _ = cmd.Flags().MarkHidden("type") + + return cmd +} + +func parseDiagnosisTargetType(value string) (civ1.FailureDiagnosisTargetType, error) { + switch value { + case "": + return civ1.FailureDiagnosisTargetType_FAILURE_DIAGNOSIS_TARGET_TYPE_UNSPECIFIED, nil + case "run": + return civ1.FailureDiagnosisTargetType_FAILURE_DIAGNOSIS_TARGET_TYPE_RUN, nil + case "workflow": + return civ1.FailureDiagnosisTargetType_FAILURE_DIAGNOSIS_TARGET_TYPE_WORKFLOW, nil + case "job": + return civ1.FailureDiagnosisTargetType_FAILURE_DIAGNOSIS_TARGET_TYPE_JOB, nil + case "attempt": + return civ1.FailureDiagnosisTargetType_FAILURE_DIAGNOSIS_TARGET_TYPE_ATTEMPT, nil + default: + return civ1.FailureDiagnosisTargetType_FAILURE_DIAGNOSIS_TARGET_TYPE_UNSPECIFIED, fmt.Errorf("unsupported type %q (valid: run, workflow, job, attempt)", value) + } +} + +type diagnosisCommandRenderer struct { + orgID string +} + +func (r diagnosisCommandRenderer) command(cmd *civ1.DrillDownCommand) diagnoseCommandJSON { + argv := append([]string(nil), cmd.GetArgv()...) + if r.orgID != "" && len(argv) > 0 { + argv = append(argv, "--org", r.orgID) + } + return diagnoseCommandJSON{ + Kind: diagnosisCommandKindString(cmd.GetKind()), + Available: cmd.GetAvailable(), + UnavailableReason: cmd.GetUnavailableReason(), + TargetID: cmd.GetTargetId(), + Label: cmd.GetLabel(), + Argv: argv, + Command: shellJoin(argv), + } +} + +func (r diagnosisCommandRenderer) commands(commands []*civ1.DrillDownCommand, capabilities *civ1.FailureDiagnosisCommandCapabilities, textOnly bool) []diagnoseCommandJSON { + out := make([]diagnoseCommandJSON, 0, len(commands)) + for _, command := range commands { + if command == nil { + continue + } + if command.GetKind() == civ1.DrillDownCommandKind_DRILL_DOWN_COMMAND_KIND_SUMMARY && !capabilities.GetSummaryCommandAvailable() { + continue + } + if textOnly && (!command.GetAvailable() || len(command.GetArgv()) == 0) { + continue + } + out = append(out, r.command(command)) + } + return out +} + +func printDiagnoseResponse(w io.Writer, resp *civ1.FailureDiagnosis, renderer diagnosisCommandRenderer) { + fmt.Fprintf(w, "Org: %s\n", resp.GetOrgId()) + if target := resp.GetTarget(); target != nil { + fmt.Fprintf(w, "Target: %s %s", diagnosisTargetTypeString(target.GetTargetType()), target.GetTargetId()) + if target.GetStatus() != "" { + fmt.Fprintf(w, " (%s)", target.GetStatus()) + } + fmt.Fprintln(w) + } + printDiagnosisContext(w, resp.GetContext()) + + switch resp.GetState() { + case civ1.FailureDiagnosisState_FAILURE_DIAGNOSIS_STATE_EMPTY: + printEmptyDiagnosis(w, resp) + case civ1.FailureDiagnosisState_FAILURE_DIAGNOSIS_STATE_OVER_LIMIT: + printOverLimitDiagnosis(w, resp, renderer) + case civ1.FailureDiagnosisState_FAILURE_DIAGNOSIS_STATE_FOCUSED_FAILURE: + printFocusedDiagnosis(w, resp, renderer) + default: + printGroupedDiagnosis(w, resp, renderer) + } +} + +func printDiagnosisContext(w io.Writer, context *civ1.FailureDiagnosisContext) { + if context == nil { + return + } + if context.GetRunId() != "" { + line := fmt.Sprintf("Run: %s", context.GetRunId()) + if context.GetRunStatus() != "" { + line += fmt.Sprintf(" (%s)", context.GetRunStatus()) + } + fmt.Fprintln(w, line) + } + if context.GetRepo() != "" || context.GetRef() != "" || context.GetSha() != "" { + fmt.Fprintf(w, "Source: %s", context.GetRepo()) + if context.GetRef() != "" { + fmt.Fprintf(w, " @ %s", context.GetRef()) + } + if context.GetSha() != "" { + fmt.Fprintf(w, " (%s)", context.GetSha()) + } + fmt.Fprintln(w) + } + if context.GetWorkflowId() != "" { + fmt.Fprintf(w, "Workflow: %s", firstNonEmpty(context.GetWorkflowName(), context.GetWorkflowPath(), context.GetWorkflowId())) + if context.GetWorkflowPath() != "" && context.GetWorkflowPath() != context.GetWorkflowName() { + fmt.Fprintf(w, " [%s]", context.GetWorkflowPath()) + } + if context.GetWorkflowStatus() != "" { + fmt.Fprintf(w, " (%s)", context.GetWorkflowStatus()) + } + fmt.Fprintln(w) + } + if context.GetJobId() != "" { + fmt.Fprintf(w, "Job: %s", firstNonEmpty(context.GetJobDisplayName(), context.GetJobKey(), context.GetJobId())) + if context.GetJobStatus() != "" { + fmt.Fprintf(w, " (%s)", context.GetJobStatus()) + } + if context.GetJobConclusion() != "" { + fmt.Fprintf(w, " conclusion=%s", context.GetJobConclusion()) + } + fmt.Fprintln(w) + } + if context.GetAttemptId() != "" { + fmt.Fprintf(w, "Attempt: #%d %s", context.GetAttempt(), context.GetAttemptId()) + if context.GetAttemptStatus() != "" { + fmt.Fprintf(w, " (%s)", context.GetAttemptStatus()) + } + if context.GetAttemptConclusion() != "" { + fmt.Fprintf(w, " conclusion=%s", context.GetAttemptConclusion()) + } + fmt.Fprintln(w) + } + if len(context.GetTruncatedContextFields()) > 0 { + fmt.Fprintf(w, "Context fields truncated: %s\n", strings.Join(context.GetTruncatedContextFields(), ", ")) + } +} + +func printEmptyDiagnosis(w io.Writer, resp *civ1.FailureDiagnosis) { + fmt.Fprintln(w) + fmt.Fprintln(w, "No CI failures found for this target.") + if resp.GetEmptyReason() != "" { + fmt.Fprintf(w, "Reason: %s\n", resp.GetEmptyReason()) + } + printBoundsSummary(w, resp) +} + +func printOverLimitDiagnosis(w io.Writer, resp *civ1.FailureDiagnosis, renderer diagnosisCommandRenderer) { + fmt.Fprintln(w) + fmt.Fprintln(w, "Diagnosis is over limit.") + bounds := resp.GetBounds() + if bounds != nil { + fmt.Fprintf(w, "Failed/problem candidates: %d", bounds.GetFailedProblemCandidateCount()) + if bounds.GetFailedProblemCandidateCap() > 0 { + fmt.Fprintf(w, " (cap %d)", bounds.GetFailedProblemCandidateCap()) + } + fmt.Fprintln(w) + if bounds.GetSkippedDependentCount() > 0 { + fmt.Fprintf(w, "Skipped dependents: %d\n", bounds.GetSkippedDependentCount()) + } + } + if len(resp.GetOverLimitBreakdown()) > 0 { + fmt.Fprintln(w) + fmt.Fprintln(w, "Narrower targets:") + for _, row := range resp.GetOverLimitBreakdown() { + fmt.Fprintf(w, " %s %s", diagnosisTargetTypeString(row.GetTargetType()), row.GetTargetId()) + if row.GetLabel() != "" { + fmt.Fprintf(w, " [%s]", row.GetLabel()) + } + if row.GetStatus() != "" { + fmt.Fprintf(w, " (%s)", row.GetStatus()) + } + fmt.Fprintf(w, ": %d failed/problem candidates\n", row.GetFailedProblemCandidateCount()) + for _, command := range renderer.commands(row.GetNextCommands(), resp.GetCommandCapabilities(), true) { + fmt.Fprintf(w, " %s: %s\n", firstNonEmpty(command.Label, "Command"), command.Command) + } + } + } + printBoundsSummary(w, resp) +} + +func printFocusedDiagnosis(w io.Writer, resp *civ1.FailureDiagnosis, renderer diagnosisCommandRenderer) { + fmt.Fprintln(w) + if len(resp.GetRepresentativeAttempts()) == 0 && len(resp.GetFailureGroups()) == 0 { + fmt.Fprintln(w, "Focused diagnosis returned no representative attempts.") + printNextCommands(w, renderer.commands(resp.GetNextCommands(), resp.GetCommandCapabilities(), true), "Next commands") + printBoundsSummary(w, resp) + return + } + if len(resp.GetRepresentativeAttempts()) > 0 { + fmt.Fprintln(w, "Focused diagnosis:") + for _, representative := range resp.GetRepresentativeAttempts() { + printRepresentativeAttempt(w, resp.GetOrgId(), representative, resp.GetCommandCapabilities(), renderer, " ") + } + } + if len(resp.GetFailureGroups()) > 0 { + printGroupedDiagnosis(w, resp, renderer) + return + } + printNextCommands(w, renderer.commands(resp.GetNextCommands(), resp.GetCommandCapabilities(), true), "Next commands") + printSummaryUnavailableNote(w, resp.GetCommandCapabilities()) + printBoundsSummary(w, resp) +} + +func printGroupedDiagnosis(w io.Writer, resp *civ1.FailureDiagnosis, renderer diagnosisCommandRenderer) { + fmt.Fprintln(w) + bounds := resp.GetBounds() + if bounds != nil && bounds.GetTotalFailureGroupCount() > 0 { + fmt.Fprintf(w, "Failure groups: %d", bounds.GetTotalFailureGroupCount()) + if bounds.GetOmittedFailureGroupCount() > 0 { + fmt.Fprintf(w, " (%d omitted)", bounds.GetOmittedFailureGroupCount()) + } + fmt.Fprintln(w) + } else { + fmt.Fprintf(w, "Failure groups: %d\n", len(resp.GetFailureGroups())) + } + for i, group := range resp.GetFailureGroups() { + fmt.Fprintf(w, "\nGroup %d: %d failure", i+1, group.GetCount()) + if group.GetCount() != 1 { + fmt.Fprint(w, "s") + } + if group.GetSource() != "" { + fmt.Fprintf(w, " from %s", group.GetSource()) + } + fmt.Fprintln(w) + if group.GetErrorMessage() != "" { + fmt.Fprintf(w, " Error: %s%s\n", group.GetErrorMessage(), truncatedSuffix(group.GetErrorMessageTruncated(), group.GetErrorMessageOriginalLength())) + } + if group.GetDiagnosis() != "" { + fmt.Fprintf(w, " Diagnosis: %s\n", group.GetDiagnosis()) + } + if group.GetPossibleFix() != "" { + fmt.Fprintf(w, " Possible fix: %s\n", group.GetPossibleFix()) + } + if len(group.GetRepresentatives()) > 0 { + fmt.Fprintln(w, " Representative attempts:") + for _, representative := range group.GetRepresentatives() { + printRepresentativeAttempt(w, resp.GetOrgId(), representative, resp.GetCommandCapabilities(), renderer, " ") + } + } + if group.GetOmittedRepresentativeCount() > 0 { + fmt.Fprintf( + w, + " Showing %d of %d similar attempts for this group.\n", + len(group.GetRepresentatives()), + len(group.GetRepresentatives())+int(group.GetOmittedRepresentativeCount()), + ) + } + } + printNextCommands(w, renderer.commands(resp.GetNextCommands(), resp.GetCommandCapabilities(), true), "Next commands") + printSummaryUnavailableNote(w, resp.GetCommandCapabilities()) + printBoundsSummary(w, resp) +} + +func printRepresentativeAttempt(w io.Writer, orgID string, representative *civ1.RepresentativeAttempt, capabilities *civ1.FailureDiagnosisCommandCapabilities, renderer diagnosisCommandRenderer, indent string) { + fmt.Fprintf(w, "%sAttempt #%d %s", indent, representative.GetAttempt(), representative.GetAttemptId()) + if representative.GetJobKey() != "" || representative.GetJobDisplayName() != "" { + fmt.Fprintf(w, " for %s", firstNonEmpty(representative.GetJobDisplayName(), representative.GetJobKey())) + } + if representative.GetAttemptStatus() != "" { + fmt.Fprintf(w, " (%s)", representative.GetAttemptStatus()) + } + fmt.Fprintln(w) + if representative.GetErrorMessage() != "" { + fmt.Fprintf(w, "%s Error: %s%s\n", indent, representative.GetErrorMessage(), truncatedSuffix(representative.GetErrorMessageTruncated(), representative.GetErrorMessageOriginalLength())) + } + if representative.GetDiagnosis() != "" { + fmt.Fprintf(w, "%s Diagnosis: %s\n", indent, representative.GetDiagnosis()) + } + if representative.GetPossibleFix() != "" { + fmt.Fprintf(w, "%s Possible fix: %s\n", indent, representative.GetPossibleFix()) + } + if len(representative.GetRelevantLines()) > 0 { + fmt.Fprintf(w, "%s Relevant lines:\n", indent) + for _, line := range representative.GetRelevantLines() { + prefix := fmt.Sprintf("%d", line.GetLineNumber()) + if line.GetStepId() != "" { + prefix = line.GetStepId() + ":" + prefix + } + fmt.Fprintf(w, "%s %s: %s%s\n", indent, prefix, line.GetContent(), truncatedSuffix(line.GetContentTruncated(), line.GetContentOriginalLength())) + } + } + for _, command := range renderer.commands(representative.GetNextCommands(), capabilities, true) { + fmt.Fprintf(w, "%s %s: %s\n", indent, firstNonEmpty(command.Label, "Command"), command.Command) + } + if orgID != "" && representative.GetWorkflowId() != "" && representative.GetJobId() != "" && representative.GetAttemptId() != "" { + fmt.Fprintf(w, "%s View: %s\n", indent, statusAttemptViewURL(orgID, representative.GetWorkflowId(), representative.GetJobId(), representative.GetAttemptId())) + } +} + +func printNextCommands(w io.Writer, commands []diagnoseCommandJSON, title string) { + if len(commands) == 0 { + return + } + fmt.Fprintln(w) + fmt.Fprintf(w, "%s:\n", title) + for _, command := range commands { + fmt.Fprintf(w, " %s: %s\n", firstNonEmpty(command.Label, "Command"), command.Command) + } +} + +func printSummaryUnavailableNote(w io.Writer, capabilities *civ1.FailureDiagnosisCommandCapabilities) { + if capabilities == nil || capabilities.GetSummaryCommandAvailable() { + return + } + fmt.Fprintln(w) + fmt.Fprintln(w, "Summary drill-down commands are not available in this build.") +} + +func printBoundsSummary(w io.Writer, resp *civ1.FailureDiagnosis) { + bounds := resp.GetBounds() + if bounds == nil { + return + } + if bounds.GetOmittedFailureGroupCount() > 0 { + fmt.Fprintf(w, "Omitted failure groups: %d; run a narrower diagnose command for details.\n", bounds.GetOmittedFailureGroupCount()) + } + if bounds.GetOmittedAttemptCount() > 0 { + fmt.Fprintf(w, "Omitted attempts: %d.\n", bounds.GetOmittedAttemptCount()) + } + if bounds.GetOmittedWorkflowBreakdownCount() > 0 { + fmt.Fprintf(w, "Omitted workflow breakdown rows: %d.\n", bounds.GetOmittedWorkflowBreakdownCount()) + } + if bounds.GetOmittedJobBreakdownCount() > 0 { + fmt.Fprintf(w, "Omitted job breakdown rows: %d.\n", bounds.GetOmittedJobBreakdownCount()) + } + if bounds.GetTruncated() { + fmt.Fprintln(w, "Output was truncated by diagnosis bounds.") + } +} + +func truncatedSuffix(truncated bool, originalLength uint32) string { + if !truncated { + return "" + } + if originalLength == 0 { + return " (truncated)" + } + return fmt.Sprintf(" (truncated from %d chars)", originalLength) +} + +type diagnoseJSONDocument struct { + OrgID string `json:"org_id"` + State string `json:"state"` + EmptyReason string `json:"empty_reason,omitempty"` + Target diagnoseTargetJSON `json:"target"` + Context diagnoseContextJSON `json:"context"` + CommandCapabilities diagnoseCommandCapabilitiesJSON `json:"command_capabilities"` + Bounds diagnoseBoundsJSON `json:"bounds"` + FailureGroups []diagnoseFailureGroupJSON `json:"failure_groups"` + RepresentativeAttempts []diagnoseRepresentativeJSON `json:"representative_attempts"` + NextCommands []diagnoseCommandJSON `json:"next_commands"` + OverLimitBreakdown []diagnoseOverLimitBreakdownJSON `json:"over_limit_breakdown"` +} + +type diagnoseTargetJSON struct { + TargetID string `json:"target_id"` + TargetType string `json:"target_type"` + Status string `json:"status"` +} + +type diagnoseContextJSON struct { + RunID string `json:"run_id"` + Repo string `json:"repo"` + Ref string `json:"ref"` + Sha string `json:"sha"` + HeadSha string `json:"head_sha"` + Trigger string `json:"trigger"` + RunStatus string `json:"run_status"` + WorkflowID string `json:"workflow_id"` + WorkflowName string `json:"workflow_name"` + WorkflowPath string `json:"workflow_path"` + WorkflowStatus string `json:"workflow_status"` + JobID string `json:"job_id"` + JobKey string `json:"job_key"` + JobDisplayName string `json:"job_display_name"` + JobStatus string `json:"job_status"` + JobConclusion string `json:"job_conclusion"` + AttemptID string `json:"attempt_id"` + Attempt int32 `json:"attempt"` + AttemptStatus string `json:"attempt_status"` + AttemptConclusion string `json:"attempt_conclusion"` + TruncatedContextFields []string `json:"truncated_context_fields"` +} + +type diagnoseCommandCapabilitiesJSON struct { + SummaryCommandAvailable bool `json:"summary_command_available"` +} + +type diagnoseBoundsJSON struct { + FailedProblemCandidateCount uint32 `json:"failed_problem_candidate_count"` + FailedProblemCandidateCap uint32 `json:"failed_problem_candidate_cap"` + TotalProblemJobCount uint32 `json:"total_problem_job_count"` + SkippedDependentCount uint32 `json:"skipped_dependent_count"` + TotalFailureGroupCount uint32 `json:"total_failure_group_count"` + OmittedFailureGroupCount uint32 `json:"omitted_failure_group_count"` + FailureGroupLimit uint32 `json:"failure_group_limit"` + RepresentativesPerGroupLimit uint32 `json:"representatives_per_group_limit"` + RecentAttemptLimit uint32 `json:"recent_attempt_limit"` + TotalAttemptCount uint32 `json:"total_attempt_count"` + OmittedAttemptCount uint32 `json:"omitted_attempt_count"` + RelevantLineLimit uint32 `json:"relevant_line_limit"` + ErrorLineBodyCharLimit uint32 `json:"error_line_body_char_limit"` + ErrorMessageCharLimit uint32 `json:"error_message_char_limit"` + ContextLabelCharLimit uint32 `json:"context_label_char_limit"` + OverLimitWorkflowBreakdownLimit uint32 `json:"over_limit_workflow_breakdown_limit"` + OverLimitJobBreakdownLimit uint32 `json:"over_limit_job_breakdown_limit"` + OmittedWorkflowBreakdownCount uint32 `json:"omitted_workflow_breakdown_count"` + OmittedJobBreakdownCount uint32 `json:"omitted_job_breakdown_count"` + Truncated bool `json:"truncated"` +} + +type diagnoseFailureGroupJSON struct { + Fingerprint string `json:"fingerprint"` + Source string `json:"source"` + Count uint32 `json:"count"` + ErrorMessage string `json:"error_message"` + ErrorMessageTruncated bool `json:"error_message_truncated"` + ErrorMessageOriginalLength uint32 `json:"error_message_original_length"` + Diagnosis string `json:"diagnosis"` + PossibleFix string `json:"possible_fix"` + Representatives []diagnoseRepresentativeJSON `json:"representatives"` + OmittedRepresentativeCount uint32 `json:"omitted_representative_count"` +} + +type diagnoseRepresentativeJSON struct { + RunID string `json:"run_id"` + WorkflowID string `json:"workflow_id"` + WorkflowName string `json:"workflow_name"` + WorkflowPath string `json:"workflow_path"` + JobID string `json:"job_id"` + JobKey string `json:"job_key"` + JobDisplayName string `json:"job_display_name"` + JobStatus string `json:"job_status"` + JobConclusion string `json:"job_conclusion"` + AttemptID string `json:"attempt_id"` + Attempt int32 `json:"attempt"` + AttemptStatus string `json:"attempt_status"` + AttemptConclusion string `json:"attempt_conclusion"` + ErrorMessage string `json:"error_message"` + ErrorMessageTruncated bool `json:"error_message_truncated"` + ErrorMessageOriginalLength uint32 `json:"error_message_original_length"` + Diagnosis string `json:"diagnosis"` + PossibleFix string `json:"possible_fix"` + RelevantLines []diagnoseRelevantLineJSON `json:"relevant_lines"` + NextCommands []diagnoseCommandJSON `json:"next_commands"` +} + +type diagnoseRelevantLineJSON struct { + StepID string `json:"step_id"` + LineNumber uint32 `json:"line_number"` + Content string `json:"content"` + ContentTruncated bool `json:"content_truncated"` + ContentOriginalLength uint32 `json:"content_original_length"` +} + +type diagnoseCommandJSON struct { + Kind string `json:"kind"` + Available bool `json:"available"` + UnavailableReason string `json:"unavailable_reason,omitempty"` + TargetID string `json:"target_id"` + Label string `json:"label"` + Argv []string `json:"argv"` + Command string `json:"command"` +} + +type diagnoseOverLimitBreakdownJSON struct { + TargetType string `json:"target_type"` + TargetID string `json:"target_id"` + Label string `json:"label"` + Status string `json:"status"` + FailedProblemCandidateCount uint32 `json:"failed_problem_candidate_count"` + NextCommands []diagnoseCommandJSON `json:"next_commands"` +} + +func buildDiagnoseJSON(resp *civ1.FailureDiagnosis, renderer diagnosisCommandRenderer) diagnoseJSONDocument { + capabilities := resp.GetCommandCapabilities() + out := diagnoseJSONDocument{ + OrgID: resp.GetOrgId(), + State: diagnosisStateString(resp.GetState()), + EmptyReason: resp.GetEmptyReason(), + Target: buildDiagnoseTargetJSON(resp.GetTarget()), + Context: buildDiagnoseContextJSON(resp.GetContext()), + CommandCapabilities: diagnoseCommandCapabilitiesJSON{SummaryCommandAvailable: capabilities.GetSummaryCommandAvailable()}, + Bounds: buildDiagnoseBoundsJSON(resp.GetBounds()), + FailureGroups: make([]diagnoseFailureGroupJSON, 0, len(resp.GetFailureGroups())), + RepresentativeAttempts: make([]diagnoseRepresentativeJSON, 0, len(resp.GetRepresentativeAttempts())), + NextCommands: renderer.commands(resp.GetNextCommands(), capabilities, false), + OverLimitBreakdown: make([]diagnoseOverLimitBreakdownJSON, 0, len(resp.GetOverLimitBreakdown())), + } + for _, group := range resp.GetFailureGroups() { + out.FailureGroups = append(out.FailureGroups, buildFailureGroupJSON(group, capabilities, renderer)) + } + for _, representative := range resp.GetRepresentativeAttempts() { + out.RepresentativeAttempts = append(out.RepresentativeAttempts, buildRepresentativeJSON(representative, capabilities, renderer)) + } + for _, row := range resp.GetOverLimitBreakdown() { + out.OverLimitBreakdown = append(out.OverLimitBreakdown, diagnoseOverLimitBreakdownJSON{ + TargetType: diagnosisTargetTypeString(row.GetTargetType()), + TargetID: row.GetTargetId(), + Label: row.GetLabel(), + Status: row.GetStatus(), + FailedProblemCandidateCount: row.GetFailedProblemCandidateCount(), + NextCommands: renderer.commands(row.GetNextCommands(), capabilities, false), + }) + } + return out +} + +func buildDiagnoseTargetJSON(target *civ1.FailureDiagnosisTarget) diagnoseTargetJSON { + if target == nil { + return diagnoseTargetJSON{TargetType: "unspecified"} + } + return diagnoseTargetJSON{ + TargetID: target.GetTargetId(), + TargetType: diagnosisTargetTypeString(target.GetTargetType()), + Status: target.GetStatus(), + } +} + +func buildDiagnoseContextJSON(context *civ1.FailureDiagnosisContext) diagnoseContextJSON { + if context == nil { + return diagnoseContextJSON{TruncatedContextFields: []string{}} + } + return diagnoseContextJSON{ + RunID: context.GetRunId(), + Repo: context.GetRepo(), + Ref: context.GetRef(), + Sha: context.GetSha(), + HeadSha: context.GetHeadSha(), + Trigger: context.GetTrigger(), + RunStatus: context.GetRunStatus(), + WorkflowID: context.GetWorkflowId(), + WorkflowName: context.GetWorkflowName(), + WorkflowPath: context.GetWorkflowPath(), + WorkflowStatus: context.GetWorkflowStatus(), + JobID: context.GetJobId(), + JobKey: context.GetJobKey(), + JobDisplayName: context.GetJobDisplayName(), + JobStatus: context.GetJobStatus(), + JobConclusion: context.GetJobConclusion(), + AttemptID: context.GetAttemptId(), + Attempt: context.GetAttempt(), + AttemptStatus: context.GetAttemptStatus(), + AttemptConclusion: context.GetAttemptConclusion(), + TruncatedContextFields: append([]string(nil), context.GetTruncatedContextFields()...), + } +} + +func buildDiagnoseBoundsJSON(bounds *civ1.FailureDiagnosisBounds) diagnoseBoundsJSON { + if bounds == nil { + return diagnoseBoundsJSON{} + } + return diagnoseBoundsJSON{ + FailedProblemCandidateCount: bounds.GetFailedProblemCandidateCount(), + FailedProblemCandidateCap: bounds.GetFailedProblemCandidateCap(), + TotalProblemJobCount: bounds.GetTotalProblemJobCount(), + SkippedDependentCount: bounds.GetSkippedDependentCount(), + TotalFailureGroupCount: bounds.GetTotalFailureGroupCount(), + OmittedFailureGroupCount: bounds.GetOmittedFailureGroupCount(), + FailureGroupLimit: bounds.GetFailureGroupLimit(), + RepresentativesPerGroupLimit: bounds.GetRepresentativesPerGroupLimit(), + RecentAttemptLimit: bounds.GetRecentAttemptLimit(), + TotalAttemptCount: bounds.GetTotalAttemptCount(), + OmittedAttemptCount: bounds.GetOmittedAttemptCount(), + RelevantLineLimit: bounds.GetRelevantLineLimit(), + ErrorLineBodyCharLimit: bounds.GetErrorLineBodyCharLimit(), + ErrorMessageCharLimit: bounds.GetErrorMessageCharLimit(), + ContextLabelCharLimit: bounds.GetContextLabelCharLimit(), + OverLimitWorkflowBreakdownLimit: bounds.GetOverLimitWorkflowBreakdownLimit(), + OverLimitJobBreakdownLimit: bounds.GetOverLimitJobBreakdownLimit(), + OmittedWorkflowBreakdownCount: bounds.GetOmittedWorkflowBreakdownCount(), + OmittedJobBreakdownCount: bounds.GetOmittedJobBreakdownCount(), + Truncated: bounds.GetTruncated(), + } +} + +func buildFailureGroupJSON(group *civ1.FailureGroup, capabilities *civ1.FailureDiagnosisCommandCapabilities, renderer diagnosisCommandRenderer) diagnoseFailureGroupJSON { + out := diagnoseFailureGroupJSON{ + Fingerprint: group.GetFingerprint(), + Source: group.GetSource(), + Count: group.GetCount(), + ErrorMessage: group.GetErrorMessage(), + ErrorMessageTruncated: group.GetErrorMessageTruncated(), + ErrorMessageOriginalLength: group.GetErrorMessageOriginalLength(), + Diagnosis: group.GetDiagnosis(), + PossibleFix: group.GetPossibleFix(), + Representatives: make([]diagnoseRepresentativeJSON, 0, len(group.GetRepresentatives())), + OmittedRepresentativeCount: group.GetOmittedRepresentativeCount(), + } + for _, representative := range group.GetRepresentatives() { + out.Representatives = append(out.Representatives, buildRepresentativeJSON(representative, capabilities, renderer)) + } + return out +} + +func buildRepresentativeJSON(representative *civ1.RepresentativeAttempt, capabilities *civ1.FailureDiagnosisCommandCapabilities, renderer diagnosisCommandRenderer) diagnoseRepresentativeJSON { + out := diagnoseRepresentativeJSON{ + RunID: representative.GetRunId(), + WorkflowID: representative.GetWorkflowId(), + WorkflowName: representative.GetWorkflowName(), + WorkflowPath: representative.GetWorkflowPath(), + JobID: representative.GetJobId(), + JobKey: representative.GetJobKey(), + JobDisplayName: representative.GetJobDisplayName(), + JobStatus: representative.GetJobStatus(), + JobConclusion: representative.GetJobConclusion(), + AttemptID: representative.GetAttemptId(), + Attempt: representative.GetAttempt(), + AttemptStatus: representative.GetAttemptStatus(), + AttemptConclusion: representative.GetAttemptConclusion(), + ErrorMessage: representative.GetErrorMessage(), + ErrorMessageTruncated: representative.GetErrorMessageTruncated(), + ErrorMessageOriginalLength: representative.GetErrorMessageOriginalLength(), + Diagnosis: representative.GetDiagnosis(), + PossibleFix: representative.GetPossibleFix(), + RelevantLines: make([]diagnoseRelevantLineJSON, 0, len(representative.GetRelevantLines())), + NextCommands: renderer.commands(representative.GetNextCommands(), capabilities, false), + } + for _, line := range representative.GetRelevantLines() { + out.RelevantLines = append(out.RelevantLines, diagnoseRelevantLineJSON{ + StepID: line.GetStepId(), + LineNumber: line.GetLineNumber(), + Content: line.GetContent(), + ContentTruncated: line.GetContentTruncated(), + ContentOriginalLength: line.GetContentOriginalLength(), + }) + } + return out +} + +func diagnosisTargetTypeString(value civ1.FailureDiagnosisTargetType) string { + switch value { + case civ1.FailureDiagnosisTargetType_FAILURE_DIAGNOSIS_TARGET_TYPE_RUN: + return "run" + case civ1.FailureDiagnosisTargetType_FAILURE_DIAGNOSIS_TARGET_TYPE_WORKFLOW: + return "workflow" + case civ1.FailureDiagnosisTargetType_FAILURE_DIAGNOSIS_TARGET_TYPE_JOB: + return "job" + case civ1.FailureDiagnosisTargetType_FAILURE_DIAGNOSIS_TARGET_TYPE_ATTEMPT: + return "attempt" + default: + return "unspecified" + } +} + +func diagnosisStateString(value civ1.FailureDiagnosisState) string { + switch value { + case civ1.FailureDiagnosisState_FAILURE_DIAGNOSIS_STATE_EMPTY: + return "empty" + case civ1.FailureDiagnosisState_FAILURE_DIAGNOSIS_STATE_GROUPED_FAILURES: + return "grouped_failures" + case civ1.FailureDiagnosisState_FAILURE_DIAGNOSIS_STATE_FOCUSED_FAILURE: + return "focused_failure" + case civ1.FailureDiagnosisState_FAILURE_DIAGNOSIS_STATE_OVER_LIMIT: + return "over_limit" + default: + return "unspecified" + } +} + +func diagnosisCommandKindString(value civ1.DrillDownCommandKind) string { + switch value { + case civ1.DrillDownCommandKind_DRILL_DOWN_COMMAND_KIND_LOGS: + return "logs" + case civ1.DrillDownCommandKind_DRILL_DOWN_COMMAND_KIND_SUMMARY: + return "summary" + case civ1.DrillDownCommandKind_DRILL_DOWN_COMMAND_KIND_DIAGNOSE_WORKFLOW: + return "diagnose_workflow" + case civ1.DrillDownCommandKind_DRILL_DOWN_COMMAND_KIND_DIAGNOSE_JOB: + return "diagnose_job" + default: + return "unspecified" + } +} + +func shellJoin(argv []string) string { + parts := make([]string, 0, len(argv)) + for _, arg := range argv { + parts = append(parts, shellQuote(arg)) + } + return strings.Join(parts, " ") +} + +func shellQuote(arg string) string { + if arg == "" { + return "''" + } + for _, r := range arg { + if !(unicode.IsLetter(r) || unicode.IsDigit(r) || strings.ContainsRune("-_./:=@", r)) { + return "'" + strings.ReplaceAll(arg, "'", `'"'"'`) + "'" + } + } + return arg +} + +func firstNonEmpty(values ...string) string { + for _, value := range values { + if value != "" { + return value + } + } + return "" +} diff --git a/pkg/cmd/ci/diagnose_test.go b/pkg/cmd/ci/diagnose_test.go new file mode 100644 index 00000000..ae1259c4 --- /dev/null +++ b/pkg/cmd/ci/diagnose_test.go @@ -0,0 +1,562 @@ +package ci + +import ( + "bytes" + "context" + "encoding/json" + "errors" + "io" + "strings" + "testing" + + "connectrpc.com/connect" + civ1 "github.com/depot/cli/pkg/proto/depot/ci/v1" +) + +func TestDiagnoseHumanGroupedOutputWithOrgQualifiedCommands(t *testing.T) { + restoreDiagnoseAPI(t) + + var calls int + var capturedToken string + var capturedOrgID string + var capturedRequest *civ1.GetFailureDiagnosisRequest + ciDiagnose = func(ctx context.Context, token, orgID string, req *civ1.GetFailureDiagnosisRequest) (*civ1.FailureDiagnosis, error) { + calls++ + capturedToken = token + capturedOrgID = orgID + capturedRequest = req + return groupedDiagnosisResponse(true), nil + } + + stdout, stderr, err := executeDiagnoseTextCommand([]string{"--org", "org-123", "--token", "token-123", "run-1"}) + if err != nil { + t.Fatal(err) + } + if stderr != "" { + t.Fatalf("stderr = %q, want empty", stderr) + } + if calls != 1 { + t.Fatalf("ciDiagnose calls = %d, want 1", calls) + } + if capturedToken != "token-123" || capturedOrgID != "org-123" { + t.Fatalf("token/org = %q/%q, want token-123/org-123", capturedToken, capturedOrgID) + } + if capturedRequest.GetTargetId() != "run-1" || capturedRequest.GetTargetType() != civ1.FailureDiagnosisTargetType_FAILURE_DIAGNOSIS_TARGET_TYPE_UNSPECIFIED { + t.Fatalf("unexpected request: %+v", capturedRequest) + } + + for _, want := range []string{ + "Target: run run-1 (failed)", + "Source: depot/cli @ refs/heads/main (abc123)", + "Failure groups: 2 (1 omitted)", + "Group 1: 3 failures from attempt_error", + "Error: go test ./... failed", + "Diagnosis: Unit tests failed in package pkg/cmd/ci.", + "Possible fix: Fix the failing assertion and rerun tests.", + "Attempt #2 att-1 for ci.yml:test (failed)", + "build:42: expected true, got false", + "Logs: depot ci logs att-1 --org org-123", + "Summary: depot ci summary att-1 --org org-123", + "View: https://depot.dev/orgs/org-123/workflows/workflow-1?job=job-1&attempt=att-1", + "Showing 1 of 3 similar attempts for this group.", + "Omitted failure groups: 1; run a narrower diagnose command for details.", + "Output was truncated by diagnosis bounds.", + } { + if !strings.Contains(stdout, want) { + t.Fatalf("diagnose output missing %q:\n%s", want, stdout) + } + } +} + +func TestDiagnoseRepresentativeSamplingDoesNotPrintGenericTruncationFooter(t *testing.T) { + restoreDiagnoseAPI(t) + + ciDiagnose = func(ctx context.Context, token, orgID string, req *civ1.GetFailureDiagnosisRequest) (*civ1.FailureDiagnosis, error) { + resp := groupedDiagnosisResponse(true) + resp.Bounds.TotalFailureGroupCount = 1 + resp.Bounds.OmittedFailureGroupCount = 0 + resp.Bounds.Truncated = false + resp.FailureGroups[0].Count = 7 + resp.FailureGroups[0].Representatives = []*civ1.RepresentativeAttempt{ + diagnoseRepresentative(true), + diagnoseRepresentative(true), + diagnoseRepresentative(true), + } + resp.FailureGroups[0].OmittedRepresentativeCount = 4 + return resp, nil + } + + stdout, _, err := executeDiagnoseTextCommand([]string{"--org", "org-123", "--token", "token-123", "run-1"}) + if err != nil { + t.Fatal(err) + } + if !strings.Contains(stdout, "Showing 3 of 7 similar attempts for this group.") { + t.Fatalf("diagnose output missing representative sampling summary:\n%s", stdout) + } + if strings.Contains(stdout, "Output was truncated by diagnosis bounds.") { + t.Fatalf("diagnose output included generic truncation footer for representative sampling only:\n%s", stdout) + } +} + +func TestDiagnoseRepresentativeSamplingStillPrintsRealTruncationFooter(t *testing.T) { + restoreDiagnoseAPI(t) + + ciDiagnose = func(ctx context.Context, token, orgID string, req *civ1.GetFailureDiagnosisRequest) (*civ1.FailureDiagnosis, error) { + resp := groupedDiagnosisResponse(true) + resp.Bounds.TotalFailureGroupCount = 1 + resp.Bounds.OmittedFailureGroupCount = 0 + resp.Bounds.Truncated = true + resp.FailureGroups[0].Count = 7 + resp.FailureGroups[0].Representatives = []*civ1.RepresentativeAttempt{ + diagnoseRepresentative(true), + diagnoseRepresentative(true), + diagnoseRepresentative(true), + } + resp.FailureGroups[0].OmittedRepresentativeCount = 4 + return resp, nil + } + + stdout, _, err := executeDiagnoseTextCommand([]string{"--org", "org-123", "--token", "token-123", "run-1"}) + if err != nil { + t.Fatal(err) + } + if !strings.Contains(stdout, "Showing 3 of 7 similar attempts for this group.") { + t.Fatalf("diagnose output missing representative sampling summary:\n%s", stdout) + } + if !strings.Contains(stdout, "Output was truncated by diagnosis bounds.") { + t.Fatalf("diagnose output missing generic truncation footer when bounds truncated is true:\n%s", stdout) + } +} + +func TestDiagnoseJSONOutputIsCLINormalized(t *testing.T) { + restoreDiagnoseAPI(t) + + ciDiagnose = func(ctx context.Context, token, orgID string, req *civ1.GetFailureDiagnosisRequest) (*civ1.FailureDiagnosis, error) { + return groupedDiagnosisResponse(true), nil + } + + cmd := NewCmdDiagnose() + cmd.SetArgs([]string{"--org", "org-123", "--token", "token-123", "--output", "json", "run-1"}) + cmd.SetOut(io.Discard) + cmd.SetErr(io.Discard) + + stdout, err := captureStdout(t, cmd.Execute) + if err != nil { + t.Fatal(err) + } + if strings.Contains(stdout, "FAILURE_DIAGNOSIS_STATE") || strings.Contains(stdout, "DRILL_DOWN_COMMAND_KIND") { + t.Fatalf("json output leaked raw protobuf enum names:\n%s", stdout) + } + + var got diagnoseJSONDocument + if err := json.Unmarshal([]byte(stdout), &got); err != nil { + t.Fatalf("invalid JSON output: %v\n%s", err, stdout) + } + if got.OrgID != "org-123" || got.State != "grouped_failures" { + t.Fatalf("unexpected top-level JSON: %+v", got) + } + if got.Target.TargetType != "run" || got.Context.JobKey != "ci.yml:test" { + t.Fatalf("unexpected target/context JSON: %+v %+v", got.Target, got.Context) + } + if !got.CommandCapabilities.SummaryCommandAvailable { + t.Fatalf("summary capability = false, want true") + } + if got.Bounds.FailedProblemCandidateCount != 3 || got.Bounds.OmittedFailureGroupCount != 1 || !got.Bounds.Truncated { + t.Fatalf("unexpected bounds JSON: %+v", got.Bounds) + } + if len(got.FailureGroups) != 1 || len(got.FailureGroups[0].Representatives) != 1 { + t.Fatalf("unexpected failure groups JSON: %+v", got.FailureGroups) + } + commands := got.FailureGroups[0].Representatives[0].NextCommands + if len(commands) != 2 { + t.Fatalf("commands = %+v, want logs and summary", commands) + } + if commands[0].Kind != "logs" || strings.Join(commands[0].Argv, " ") != "depot ci logs att-1 --org org-123" || commands[0].Command != "depot ci logs att-1 --org org-123" { + t.Fatalf("unexpected logs command JSON: %+v", commands[0]) + } + if commands[1].Kind != "summary" || commands[1].Command != "depot ci summary att-1 --org org-123" { + t.Fatalf("unexpected summary command JSON: %+v", commands[1]) + } +} + +func TestDiagnoseOmitsSummaryCommandsWhenUnavailable(t *testing.T) { + restoreDiagnoseAPI(t) + + ciDiagnose = func(ctx context.Context, token, orgID string, req *civ1.GetFailureDiagnosisRequest) (*civ1.FailureDiagnosis, error) { + return focusedDiagnosisResponse(false), nil + } + + stdout, _, err := executeDiagnoseTextCommand([]string{"--org", "org-123", "--token", "token-123", "--type", "attempt", "att-1"}) + if err != nil { + t.Fatal(err) + } + if strings.Contains(stdout, "depot ci summary") { + t.Fatalf("summary command rendered when unavailable:\n%s", stdout) + } + if !strings.Contains(stdout, "Summary drill-down commands are not available in this build.") { + t.Fatalf("missing summary unavailable note:\n%s", stdout) + } + + cmd := NewCmdDiagnose() + cmd.SetArgs([]string{"--org", "org-123", "--token", "token-123", "--type", "attempt", "--output", "json", "att-1"}) + cmd.SetOut(io.Discard) + cmd.SetErr(io.Discard) + jsonStdout, err := captureStdout(t, cmd.Execute) + if err != nil { + t.Fatal(err) + } + var got diagnoseJSONDocument + if err := json.Unmarshal([]byte(jsonStdout), &got); err != nil { + t.Fatalf("invalid JSON output: %v\n%s", err, jsonStdout) + } + if got.CommandCapabilities.SummaryCommandAvailable { + t.Fatalf("summary capability = true, want false") + } + if len(got.RepresentativeAttempts) != 1 { + t.Fatalf("representative_attempts = %+v", got.RepresentativeAttempts) + } + for _, command := range got.RepresentativeAttempts[0].NextCommands { + if command.Kind == "summary" || strings.Contains(command.Command, "summary") { + t.Fatalf("summary command should be omitted: %+v", command) + } + } +} + +func TestDiagnoseCommandsDoNotIncludeOrgWhenFlagOmitted(t *testing.T) { + restoreDiagnoseAPI(t) + + ciDiagnose = func(ctx context.Context, token, orgID string, req *civ1.GetFailureDiagnosisRequest) (*civ1.FailureDiagnosis, error) { + return focusedDiagnosisResponse(true), nil + } + + stdout, _, err := executeDiagnoseTextCommand([]string{"--token", "token-123", "--type", "attempt", "att-1"}) + if err != nil { + t.Fatal(err) + } + if !strings.Contains(stdout, "Logs: depot ci logs att-1\n") { + t.Fatalf("logs command without org flag missing:\n%s", stdout) + } + if strings.Contains(stdout, "--org") { + t.Fatalf("org flag rendered despite not being user-supplied:\n%s", stdout) + } +} + +func TestDiagnoseEmptyStateIsNonError(t *testing.T) { + restoreDiagnoseAPI(t) + + ciDiagnose = func(ctx context.Context, token, orgID string, req *civ1.GetFailureDiagnosisRequest) (*civ1.FailureDiagnosis, error) { + return &civ1.FailureDiagnosis{ + OrgId: "org-123", + Target: &civ1.FailureDiagnosisTarget{TargetId: "run-1", TargetType: civ1.FailureDiagnosisTargetType_FAILURE_DIAGNOSIS_TARGET_TYPE_RUN, Status: "finished"}, + State: civ1.FailureDiagnosisState_FAILURE_DIAGNOSIS_STATE_EMPTY, + EmptyReason: "no_failed_jobs", + Bounds: &civ1.FailureDiagnosisBounds{TotalProblemJobCount: 0}, + }, nil + } + + stdout, stderr, err := executeDiagnoseTextCommand([]string{"--org", "org-123", "--token", "token-123", "run-1"}) + if err != nil { + t.Fatal(err) + } + if stderr != "" { + t.Fatalf("stderr = %q, want empty", stderr) + } + if !strings.Contains(stdout, "No CI failures found for this target.") || !strings.Contains(stdout, "Reason: no_failed_jobs") { + t.Fatalf("empty output missing expected message:\n%s", stdout) + } +} + +func TestDiagnoseOverLimitStateRendersBreakdown(t *testing.T) { + restoreDiagnoseAPI(t) + + ciDiagnose = func(ctx context.Context, token, orgID string, req *civ1.GetFailureDiagnosisRequest) (*civ1.FailureDiagnosis, error) { + return overLimitDiagnosisResponse(), nil + } + + stdout, _, err := executeDiagnoseTextCommand([]string{"--org", "org-123", "--token", "token-123", "--type", "run", "run-1"}) + if err != nil { + t.Fatal(err) + } + for _, want := range []string{ + "Diagnosis is over limit.", + "Failed/problem candidates: 650 (cap 512)", + "workflow workflow-1 [ci.yml] (failed): 500 failed/problem candidates", + "Diagnose: depot ci diagnose workflow-1 --org org-123", + "Omitted job breakdown rows: 3.", + "Output was truncated by diagnosis bounds.", + } { + if !strings.Contains(stdout, want) { + t.Fatalf("over-limit output missing %q:\n%s", want, stdout) + } + } +} + +func TestDiagnoseTypeParsingAndInvalidFlagsBeforeAPI(t *testing.T) { + tests := map[string]civ1.FailureDiagnosisTargetType{ + "": civ1.FailureDiagnosisTargetType_FAILURE_DIAGNOSIS_TARGET_TYPE_UNSPECIFIED, + "run": civ1.FailureDiagnosisTargetType_FAILURE_DIAGNOSIS_TARGET_TYPE_RUN, + "workflow": civ1.FailureDiagnosisTargetType_FAILURE_DIAGNOSIS_TARGET_TYPE_WORKFLOW, + "job": civ1.FailureDiagnosisTargetType_FAILURE_DIAGNOSIS_TARGET_TYPE_JOB, + "attempt": civ1.FailureDiagnosisTargetType_FAILURE_DIAGNOSIS_TARGET_TYPE_ATTEMPT, + } + for input, want := range tests { + got, err := parseDiagnosisTargetType(input) + if err != nil { + t.Fatalf("parseDiagnosisTargetType(%q) returned error: %v", input, err) + } + if got != want { + t.Fatalf("parseDiagnosisTargetType(%q) = %v, want %v", input, got, want) + } + } + if _, err := parseDiagnosisTargetType("whybad"); err == nil || !strings.Contains(err.Error(), `unsupported type "whybad"`) { + t.Fatalf("invalid type error = %v", err) + } + + restoreDiagnoseAPI(t) + ciDiagnose = func(ctx context.Context, token, orgID string, req *civ1.GetFailureDiagnosisRequest) (*civ1.FailureDiagnosis, error) { + t.Fatal("diagnose API should not be called for invalid flags") + return nil, nil + } + + cmd := NewCmdDiagnose() + cmd.SetArgs([]string{"--token", "token-123", "--type", "whybad", "run-1"}) + cmd.SetOut(io.Discard) + cmd.SetErr(io.Discard) + if err := cmd.Execute(); err == nil || !strings.Contains(err.Error(), `unsupported type "whybad"`) { + t.Fatalf("invalid type command error = %v", err) + } + + cmd = NewCmdDiagnose() + cmd.SetArgs([]string{"--token", "token-123", "--output", "yaml", "run-1"}) + cmd.SetOut(io.Discard) + cmd.SetErr(io.Discard) + if err := cmd.Execute(); err == nil || !strings.Contains(err.Error(), `unsupported output "yaml"`) { + t.Fatalf("invalid output command error = %v", err) + } +} + +func TestDiagnoseAPIErrorDoesNotProbeOtherAPIs(t *testing.T) { + restoreDiagnoseAPI(t) + + var calls int + ciDiagnose = func(ctx context.Context, token, orgID string, req *civ1.GetFailureDiagnosisRequest) (*civ1.FailureDiagnosis, error) { + calls++ + return nil, connect.NewError(connect.CodeNotFound, errors.New("not found")) + } + + _, _, err := executeDiagnoseTextCommand([]string{"--org", "org-123", "--token", "token-123", "missing-id"}) + if err == nil || !strings.Contains(err.Error(), "failed to diagnose CI target") { + t.Fatalf("err = %v", err) + } + if calls != 1 { + t.Fatalf("ciDiagnose calls = %d, want 1", calls) + } +} + +func executeDiagnoseTextCommand(args []string) (string, string, error) { + var stdout bytes.Buffer + var stderr bytes.Buffer + cmd := NewCmdDiagnose() + cmd.SetArgs(args) + cmd.SetOut(&stdout) + cmd.SetErr(&stderr) + err := cmd.Execute() + return stdout.String(), stderr.String(), err +} + +func restoreDiagnoseAPI(t *testing.T) { + t.Helper() + + originalDiagnose := ciDiagnose + t.Cleanup(func() { + ciDiagnose = originalDiagnose + }) +} + +func groupedDiagnosisResponse(summaryAvailable bool) *civ1.FailureDiagnosis { + return &civ1.FailureDiagnosis{ + OrgId: "org-123", + Target: &civ1.FailureDiagnosisTarget{ + TargetId: "run-1", + TargetType: civ1.FailureDiagnosisTargetType_FAILURE_DIAGNOSIS_TARGET_TYPE_RUN, + Status: "failed", + }, + Context: &civ1.FailureDiagnosisContext{ + RunId: "run-1", + Repo: "depot/cli", + Ref: "refs/heads/main", + Sha: "abc123", + RunStatus: "failed", + WorkflowId: "workflow-1", + WorkflowName: "CI", + WorkflowPath: ".depot/workflows/ci.yml", + WorkflowStatus: "failed", + JobId: "job-1", + JobKey: "ci.yml:test", + JobStatus: "failed", + AttemptId: "att-1", + Attempt: 2, + AttemptStatus: "failed", + }, + State: civ1.FailureDiagnosisState_FAILURE_DIAGNOSIS_STATE_GROUPED_FAILURES, + FailureGroups: []*civ1.FailureGroup{ + { + Fingerprint: "attempt_error:go-test", + Source: "attempt_error", + Count: 3, + ErrorMessage: "go test ./... failed", + ErrorMessageTruncated: false, + ErrorMessageOriginalLength: 20, + Diagnosis: "Unit tests failed in package pkg/cmd/ci.", + PossibleFix: "Fix the failing assertion and rerun tests.", + Representatives: []*civ1.RepresentativeAttempt{ + diagnoseRepresentative(summaryAvailable), + }, + OmittedRepresentativeCount: 2, + }, + }, + Bounds: &civ1.FailureDiagnosisBounds{ + FailedProblemCandidateCount: 3, + FailedProblemCandidateCap: 512, + TotalProblemJobCount: 3, + TotalFailureGroupCount: 2, + OmittedFailureGroupCount: 1, + FailureGroupLimit: 20, + RepresentativesPerGroupLimit: 3, + RelevantLineLimit: 10, + ErrorLineBodyCharLimit: 8000, + ErrorMessageCharLimit: 2000, + ContextLabelCharLimit: 255, + Truncated: true, + }, + CommandCapabilities: &civ1.FailureDiagnosisCommandCapabilities{SummaryCommandAvailable: summaryAvailable}, + } +} + +func focusedDiagnosisResponse(summaryAvailable bool) *civ1.FailureDiagnosis { + return &civ1.FailureDiagnosis{ + OrgId: "org-123", + Target: &civ1.FailureDiagnosisTarget{ + TargetId: "att-1", + TargetType: civ1.FailureDiagnosisTargetType_FAILURE_DIAGNOSIS_TARGET_TYPE_ATTEMPT, + Status: "failed", + }, + Context: &civ1.FailureDiagnosisContext{ + RunId: "run-1", + WorkflowId: "workflow-1", + WorkflowStatus: "failed", + JobId: "job-1", + JobKey: "ci.yml:test", + JobStatus: "failed", + AttemptId: "att-1", + Attempt: 2, + AttemptStatus: "failed", + }, + State: civ1.FailureDiagnosisState_FAILURE_DIAGNOSIS_STATE_FOCUSED_FAILURE, + RepresentativeAttempts: []*civ1.RepresentativeAttempt{diagnoseRepresentative(summaryAvailable)}, + CommandCapabilities: &civ1.FailureDiagnosisCommandCapabilities{SummaryCommandAvailable: summaryAvailable}, + Bounds: &civ1.FailureDiagnosisBounds{TotalAttemptCount: 1, RecentAttemptLimit: 5}, + } +} + +func diagnoseRepresentative(summaryAvailable bool) *civ1.RepresentativeAttempt { + commands := []*civ1.DrillDownCommand{logsCommand("att-1")} + if summaryAvailable { + commands = append(commands, summaryCommand("att-1")) + } else { + commands = append(commands, &civ1.DrillDownCommand{ + Kind: civ1.DrillDownCommandKind_DRILL_DOWN_COMMAND_KIND_SUMMARY, + Available: false, + UnavailableReason: "summary_command_unavailable", + TargetId: "att-1", + Label: "Summary", + }) + } + return &civ1.RepresentativeAttempt{ + RunId: "run-1", + WorkflowId: "workflow-1", + WorkflowName: "CI", + WorkflowPath: ".depot/workflows/ci.yml", + JobId: "job-1", + JobKey: "ci.yml:test", + JobStatus: "failed", + AttemptId: "att-1", + Attempt: 2, + AttemptStatus: "failed", + ErrorMessage: "go test ./... failed", + ErrorMessageOriginalLength: 20, + Diagnosis: "Unit tests failed in package pkg/cmd/ci.", + PossibleFix: "Fix the failing assertion and rerun tests.", + RelevantLines: []*civ1.RelevantErrorLine{ + { + StepId: "build", + LineNumber: 42, + Content: "expected true, got false", + }, + }, + NextCommands: commands, + } +} + +func overLimitDiagnosisResponse() *civ1.FailureDiagnosis { + return &civ1.FailureDiagnosis{ + OrgId: "org-123", + Target: &civ1.FailureDiagnosisTarget{ + TargetId: "run-1", + TargetType: civ1.FailureDiagnosisTargetType_FAILURE_DIAGNOSIS_TARGET_TYPE_RUN, + Status: "failed", + }, + Context: &civ1.FailureDiagnosisContext{ + RunId: "run-1", + RunStatus: "failed", + }, + State: civ1.FailureDiagnosisState_FAILURE_DIAGNOSIS_STATE_OVER_LIMIT, + Bounds: &civ1.FailureDiagnosisBounds{ + FailedProblemCandidateCount: 650, + FailedProblemCandidateCap: 512, + OverLimitWorkflowBreakdownLimit: 25, + OverLimitJobBreakdownLimit: 25, + OmittedJobBreakdownCount: 3, + Truncated: true, + }, + OverLimitBreakdown: []*civ1.FailureDiagnosisBreakdownRow{ + { + TargetType: civ1.FailureDiagnosisTargetType_FAILURE_DIAGNOSIS_TARGET_TYPE_WORKFLOW, + TargetId: "workflow-1", + Label: "ci.yml", + Status: "failed", + FailedProblemCandidateCount: 500, + NextCommands: []*civ1.DrillDownCommand{ + { + Kind: civ1.DrillDownCommandKind_DRILL_DOWN_COMMAND_KIND_DIAGNOSE_WORKFLOW, + Available: true, + Argv: []string{"depot", "ci", "diagnose", "workflow-1"}, + TargetId: "workflow-1", + Label: "Diagnose", + }, + }, + }, + }, + CommandCapabilities: &civ1.FailureDiagnosisCommandCapabilities{SummaryCommandAvailable: true}, + } +} + +func logsCommand(attemptID string) *civ1.DrillDownCommand { + return &civ1.DrillDownCommand{ + Kind: civ1.DrillDownCommandKind_DRILL_DOWN_COMMAND_KIND_LOGS, + Available: true, + Argv: []string{"depot", "ci", "logs", attemptID}, + TargetId: attemptID, + Label: "Logs", + } +} + +func summaryCommand(attemptID string) *civ1.DrillDownCommand { + return &civ1.DrillDownCommand{ + Kind: civ1.DrillDownCommandKind_DRILL_DOWN_COMMAND_KIND_SUMMARY, + Available: true, + Argv: []string{"depot", "ci", "summary", attemptID}, + TargetId: attemptID, + Label: "Summary", + } +} diff --git a/pkg/proto/depot/ci/v1/ci.pb.go b/pkg/proto/depot/ci/v1/ci.pb.go index 51ae9b3b..4d0a2399 100644 --- a/pkg/proto/depot/ci/v1/ci.pb.go +++ b/pkg/proto/depot/ci/v1/ci.pb.go @@ -20,6 +20,171 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +type FailureDiagnosisTargetType int32 + +const ( + FailureDiagnosisTargetType_FAILURE_DIAGNOSIS_TARGET_TYPE_UNSPECIFIED FailureDiagnosisTargetType = 0 + FailureDiagnosisTargetType_FAILURE_DIAGNOSIS_TARGET_TYPE_RUN FailureDiagnosisTargetType = 1 + FailureDiagnosisTargetType_FAILURE_DIAGNOSIS_TARGET_TYPE_WORKFLOW FailureDiagnosisTargetType = 2 + FailureDiagnosisTargetType_FAILURE_DIAGNOSIS_TARGET_TYPE_JOB FailureDiagnosisTargetType = 3 + FailureDiagnosisTargetType_FAILURE_DIAGNOSIS_TARGET_TYPE_ATTEMPT FailureDiagnosisTargetType = 4 +) + +// Enum value maps for FailureDiagnosisTargetType. +var ( + FailureDiagnosisTargetType_name = map[int32]string{ + 0: "FAILURE_DIAGNOSIS_TARGET_TYPE_UNSPECIFIED", + 1: "FAILURE_DIAGNOSIS_TARGET_TYPE_RUN", + 2: "FAILURE_DIAGNOSIS_TARGET_TYPE_WORKFLOW", + 3: "FAILURE_DIAGNOSIS_TARGET_TYPE_JOB", + 4: "FAILURE_DIAGNOSIS_TARGET_TYPE_ATTEMPT", + } + FailureDiagnosisTargetType_value = map[string]int32{ + "FAILURE_DIAGNOSIS_TARGET_TYPE_UNSPECIFIED": 0, + "FAILURE_DIAGNOSIS_TARGET_TYPE_RUN": 1, + "FAILURE_DIAGNOSIS_TARGET_TYPE_WORKFLOW": 2, + "FAILURE_DIAGNOSIS_TARGET_TYPE_JOB": 3, + "FAILURE_DIAGNOSIS_TARGET_TYPE_ATTEMPT": 4, + } +) + +func (x FailureDiagnosisTargetType) Enum() *FailureDiagnosisTargetType { + p := new(FailureDiagnosisTargetType) + *p = x + return p +} + +func (x FailureDiagnosisTargetType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (FailureDiagnosisTargetType) Descriptor() protoreflect.EnumDescriptor { + return file_depot_ci_v1_ci_proto_enumTypes[0].Descriptor() +} + +func (FailureDiagnosisTargetType) Type() protoreflect.EnumType { + return &file_depot_ci_v1_ci_proto_enumTypes[0] +} + +func (x FailureDiagnosisTargetType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use FailureDiagnosisTargetType.Descriptor instead. +func (FailureDiagnosisTargetType) EnumDescriptor() ([]byte, []int) { + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{0} +} + +type FailureDiagnosisState int32 + +const ( + FailureDiagnosisState_FAILURE_DIAGNOSIS_STATE_UNSPECIFIED FailureDiagnosisState = 0 + FailureDiagnosisState_FAILURE_DIAGNOSIS_STATE_EMPTY FailureDiagnosisState = 1 + FailureDiagnosisState_FAILURE_DIAGNOSIS_STATE_GROUPED_FAILURES FailureDiagnosisState = 2 + FailureDiagnosisState_FAILURE_DIAGNOSIS_STATE_FOCUSED_FAILURE FailureDiagnosisState = 3 + FailureDiagnosisState_FAILURE_DIAGNOSIS_STATE_OVER_LIMIT FailureDiagnosisState = 4 +) + +// Enum value maps for FailureDiagnosisState. +var ( + FailureDiagnosisState_name = map[int32]string{ + 0: "FAILURE_DIAGNOSIS_STATE_UNSPECIFIED", + 1: "FAILURE_DIAGNOSIS_STATE_EMPTY", + 2: "FAILURE_DIAGNOSIS_STATE_GROUPED_FAILURES", + 3: "FAILURE_DIAGNOSIS_STATE_FOCUSED_FAILURE", + 4: "FAILURE_DIAGNOSIS_STATE_OVER_LIMIT", + } + FailureDiagnosisState_value = map[string]int32{ + "FAILURE_DIAGNOSIS_STATE_UNSPECIFIED": 0, + "FAILURE_DIAGNOSIS_STATE_EMPTY": 1, + "FAILURE_DIAGNOSIS_STATE_GROUPED_FAILURES": 2, + "FAILURE_DIAGNOSIS_STATE_FOCUSED_FAILURE": 3, + "FAILURE_DIAGNOSIS_STATE_OVER_LIMIT": 4, + } +) + +func (x FailureDiagnosisState) Enum() *FailureDiagnosisState { + p := new(FailureDiagnosisState) + *p = x + return p +} + +func (x FailureDiagnosisState) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (FailureDiagnosisState) Descriptor() protoreflect.EnumDescriptor { + return file_depot_ci_v1_ci_proto_enumTypes[1].Descriptor() +} + +func (FailureDiagnosisState) Type() protoreflect.EnumType { + return &file_depot_ci_v1_ci_proto_enumTypes[1] +} + +func (x FailureDiagnosisState) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use FailureDiagnosisState.Descriptor instead. +func (FailureDiagnosisState) EnumDescriptor() ([]byte, []int) { + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{1} +} + +type DrillDownCommandKind int32 + +const ( + DrillDownCommandKind_DRILL_DOWN_COMMAND_KIND_UNSPECIFIED DrillDownCommandKind = 0 + DrillDownCommandKind_DRILL_DOWN_COMMAND_KIND_LOGS DrillDownCommandKind = 1 + DrillDownCommandKind_DRILL_DOWN_COMMAND_KIND_SUMMARY DrillDownCommandKind = 2 + DrillDownCommandKind_DRILL_DOWN_COMMAND_KIND_DIAGNOSE_WORKFLOW DrillDownCommandKind = 3 + DrillDownCommandKind_DRILL_DOWN_COMMAND_KIND_DIAGNOSE_JOB DrillDownCommandKind = 4 +) + +// Enum value maps for DrillDownCommandKind. +var ( + DrillDownCommandKind_name = map[int32]string{ + 0: "DRILL_DOWN_COMMAND_KIND_UNSPECIFIED", + 1: "DRILL_DOWN_COMMAND_KIND_LOGS", + 2: "DRILL_DOWN_COMMAND_KIND_SUMMARY", + 3: "DRILL_DOWN_COMMAND_KIND_DIAGNOSE_WORKFLOW", + 4: "DRILL_DOWN_COMMAND_KIND_DIAGNOSE_JOB", + } + DrillDownCommandKind_value = map[string]int32{ + "DRILL_DOWN_COMMAND_KIND_UNSPECIFIED": 0, + "DRILL_DOWN_COMMAND_KIND_LOGS": 1, + "DRILL_DOWN_COMMAND_KIND_SUMMARY": 2, + "DRILL_DOWN_COMMAND_KIND_DIAGNOSE_WORKFLOW": 3, + "DRILL_DOWN_COMMAND_KIND_DIAGNOSE_JOB": 4, + } +) + +func (x DrillDownCommandKind) Enum() *DrillDownCommandKind { + p := new(DrillDownCommandKind) + *p = x + return p +} + +func (x DrillDownCommandKind) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (DrillDownCommandKind) Descriptor() protoreflect.EnumDescriptor { + return file_depot_ci_v1_ci_proto_enumTypes[2].Descriptor() +} + +func (DrillDownCommandKind) Type() protoreflect.EnumType { + return &file_depot_ci_v1_ci_proto_enumTypes[2] +} + +func (x DrillDownCommandKind) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use DrillDownCommandKind.Descriptor instead. +func (DrillDownCommandKind) EnumDescriptor() ([]byte, []int) { + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{2} +} + type CIMetricsAvailabilityCode int32 const ( @@ -59,11 +224,11 @@ func (x CIMetricsAvailabilityCode) String() string { } func (CIMetricsAvailabilityCode) Descriptor() protoreflect.EnumDescriptor { - return file_depot_ci_v1_ci_proto_enumTypes[0].Descriptor() + return file_depot_ci_v1_ci_proto_enumTypes[3].Descriptor() } func (CIMetricsAvailabilityCode) Type() protoreflect.EnumType { - return &file_depot_ci_v1_ci_proto_enumTypes[0] + return &file_depot_ci_v1_ci_proto_enumTypes[3] } func (x CIMetricsAvailabilityCode) Number() protoreflect.EnumNumber { @@ -72,7 +237,7 @@ func (x CIMetricsAvailabilityCode) Number() protoreflect.EnumNumber { // Deprecated: Use CIMetricsAvailabilityCode.Descriptor instead. func (CIMetricsAvailabilityCode) EnumDescriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{0} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{3} } type JobAttemptLogExportFormat int32 @@ -113,11 +278,11 @@ func (x JobAttemptLogExportFormat) String() string { } func (JobAttemptLogExportFormat) Descriptor() protoreflect.EnumDescriptor { - return file_depot_ci_v1_ci_proto_enumTypes[1].Descriptor() + return file_depot_ci_v1_ci_proto_enumTypes[4].Descriptor() } func (JobAttemptLogExportFormat) Type() protoreflect.EnumType { - return &file_depot_ci_v1_ci_proto_enumTypes[1] + return &file_depot_ci_v1_ci_proto_enumTypes[4] } func (x JobAttemptLogExportFormat) Number() protoreflect.EnumNumber { @@ -126,7 +291,7 @@ func (x JobAttemptLogExportFormat) Number() protoreflect.EnumNumber { // Deprecated: Use JobAttemptLogExportFormat.Descriptor instead. func (JobAttemptLogExportFormat) EnumDescriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{1} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{4} } type GetInstallationRequest struct { @@ -2616,17 +2781,18 @@ func (x *GetWorkflowJobAttempt) GetFinishedAt() string { return "" } -type GetJobAttemptMetricsRequest struct { +type GetFailureDiagnosisRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // attempt_id identifies the concrete job attempt whose metric samples to fetch. - AttemptId string `protobuf:"bytes,1,opt,name=attempt_id,json=attemptId,proto3" json:"attempt_id,omitempty"` + // target_id identifies a run, workflow, job, or attempt. When target_type is unspecified the server resolves it. + TargetId string `protobuf:"bytes,1,opt,name=target_id,json=targetId,proto3" json:"target_id,omitempty"` + TargetType FailureDiagnosisTargetType `protobuf:"varint,2,opt,name=target_type,json=targetType,proto3,enum=depot.ci.v1.FailureDiagnosisTargetType" json:"target_type,omitempty"` } -func (x *GetJobAttemptMetricsRequest) Reset() { - *x = GetJobAttemptMetricsRequest{} +func (x *GetFailureDiagnosisRequest) Reset() { + *x = GetFailureDiagnosisRequest{} if protoimpl.UnsafeEnabled { mi := &file_depot_ci_v1_ci_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2634,13 +2800,13 @@ func (x *GetJobAttemptMetricsRequest) Reset() { } } -func (x *GetJobAttemptMetricsRequest) String() string { +func (x *GetFailureDiagnosisRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetJobAttemptMetricsRequest) ProtoMessage() {} +func (*GetFailureDiagnosisRequest) ProtoMessage() {} -func (x *GetJobAttemptMetricsRequest) ProtoReflect() protoreflect.Message { +func (x *GetFailureDiagnosisRequest) ProtoReflect() protoreflect.Message { mi := &file_depot_ci_v1_ci_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2652,29 +2818,45 @@ func (x *GetJobAttemptMetricsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetJobAttemptMetricsRequest.ProtoReflect.Descriptor instead. -func (*GetJobAttemptMetricsRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use GetFailureDiagnosisRequest.ProtoReflect.Descriptor instead. +func (*GetFailureDiagnosisRequest) Descriptor() ([]byte, []int) { return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{35} } -func (x *GetJobAttemptMetricsRequest) GetAttemptId() string { +func (x *GetFailureDiagnosisRequest) GetTargetId() string { if x != nil { - return x.AttemptId + return x.TargetId } return "" } -type GetJobMetricsRequest struct { +func (x *GetFailureDiagnosisRequest) GetTargetType() FailureDiagnosisTargetType { + if x != nil { + return x.TargetType + } + return FailureDiagnosisTargetType_FAILURE_DIAGNOSIS_TARGET_TYPE_UNSPECIFIED +} + +type FailureDiagnosis struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // job_id identifies the job whose attempts should be summarized. - JobId string `protobuf:"bytes,1,opt,name=job_id,json=jobId,proto3" json:"job_id,omitempty"` -} - -func (x *GetJobMetricsRequest) Reset() { - *x = GetJobMetricsRequest{} + OrgId string `protobuf:"bytes,1,opt,name=org_id,json=orgId,proto3" json:"org_id,omitempty"` + Target *FailureDiagnosisTarget `protobuf:"bytes,2,opt,name=target,proto3" json:"target,omitempty"` + Context *FailureDiagnosisContext `protobuf:"bytes,3,opt,name=context,proto3" json:"context,omitempty"` + State FailureDiagnosisState `protobuf:"varint,4,opt,name=state,proto3,enum=depot.ci.v1.FailureDiagnosisState" json:"state,omitempty"` + EmptyReason string `protobuf:"bytes,5,opt,name=empty_reason,json=emptyReason,proto3" json:"empty_reason,omitempty"` + FailureGroups []*FailureGroup `protobuf:"bytes,6,rep,name=failure_groups,json=failureGroups,proto3" json:"failure_groups,omitempty"` + RepresentativeAttempts []*RepresentativeAttempt `protobuf:"bytes,7,rep,name=representative_attempts,json=representativeAttempts,proto3" json:"representative_attempts,omitempty"` + Bounds *FailureDiagnosisBounds `protobuf:"bytes,8,opt,name=bounds,proto3" json:"bounds,omitempty"` + NextCommands []*DrillDownCommand `protobuf:"bytes,9,rep,name=next_commands,json=nextCommands,proto3" json:"next_commands,omitempty"` + CommandCapabilities *FailureDiagnosisCommandCapabilities `protobuf:"bytes,10,opt,name=command_capabilities,json=commandCapabilities,proto3" json:"command_capabilities,omitempty"` + OverLimitBreakdown []*FailureDiagnosisBreakdownRow `protobuf:"bytes,11,rep,name=over_limit_breakdown,json=overLimitBreakdown,proto3" json:"over_limit_breakdown,omitempty"` +} + +func (x *FailureDiagnosis) Reset() { + *x = FailureDiagnosis{} if protoimpl.UnsafeEnabled { mi := &file_depot_ci_v1_ci_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2682,13 +2864,13 @@ func (x *GetJobMetricsRequest) Reset() { } } -func (x *GetJobMetricsRequest) String() string { +func (x *FailureDiagnosis) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetJobMetricsRequest) ProtoMessage() {} +func (*FailureDiagnosis) ProtoMessage() {} -func (x *GetJobMetricsRequest) ProtoReflect() protoreflect.Message { +func (x *FailureDiagnosis) ProtoReflect() protoreflect.Message { mi := &file_depot_ci_v1_ci_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2700,96 +2882,115 @@ func (x *GetJobMetricsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetJobMetricsRequest.ProtoReflect.Descriptor instead. -func (*GetJobMetricsRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use FailureDiagnosis.ProtoReflect.Descriptor instead. +func (*FailureDiagnosis) Descriptor() ([]byte, []int) { return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{36} } -func (x *GetJobMetricsRequest) GetJobId() string { +func (x *FailureDiagnosis) GetOrgId() string { if x != nil { - return x.JobId + return x.OrgId } return "" } -type GetRunMetricsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *FailureDiagnosis) GetTarget() *FailureDiagnosisTarget { + if x != nil { + return x.Target + } + return nil +} - // run_id identifies the run whose workflow/job/attempt metrics should be summarized. - RunId string `protobuf:"bytes,1,opt,name=run_id,json=runId,proto3" json:"run_id,omitempty"` +func (x *FailureDiagnosis) GetContext() *FailureDiagnosisContext { + if x != nil { + return x.Context + } + return nil } -func (x *GetRunMetricsRequest) Reset() { - *x = GetRunMetricsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[37] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *FailureDiagnosis) GetState() FailureDiagnosisState { + if x != nil { + return x.State } + return FailureDiagnosisState_FAILURE_DIAGNOSIS_STATE_UNSPECIFIED } -func (x *GetRunMetricsRequest) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *FailureDiagnosis) GetEmptyReason() string { + if x != nil { + return x.EmptyReason + } + return "" } -func (*GetRunMetricsRequest) ProtoMessage() {} +func (x *FailureDiagnosis) GetFailureGroups() []*FailureGroup { + if x != nil { + return x.FailureGroups + } + return nil +} -func (x *GetRunMetricsRequest) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[37] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *FailureDiagnosis) GetRepresentativeAttempts() []*RepresentativeAttempt { + if x != nil { + return x.RepresentativeAttempts } - return mi.MessageOf(x) + return nil } -// Deprecated: Use GetRunMetricsRequest.ProtoReflect.Descriptor instead. -func (*GetRunMetricsRequest) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{37} +func (x *FailureDiagnosis) GetBounds() *FailureDiagnosisBounds { + if x != nil { + return x.Bounds + } + return nil } -func (x *GetRunMetricsRequest) GetRunId() string { +func (x *FailureDiagnosis) GetNextCommands() []*DrillDownCommand { if x != nil { - return x.RunId + return x.NextCommands } - return "" + return nil } -type GetJobAttemptMetricsResponse struct { +func (x *FailureDiagnosis) GetCommandCapabilities() *FailureDiagnosisCommandCapabilities { + if x != nil { + return x.CommandCapabilities + } + return nil +} + +func (x *FailureDiagnosis) GetOverLimitBreakdown() []*FailureDiagnosisBreakdownRow { + if x != nil { + return x.OverLimitBreakdown + } + return nil +} + +type FailureDiagnosisTarget struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Run *CIMetricsRunContext `protobuf:"bytes,1,opt,name=run,proto3" json:"run,omitempty"` - Workflow *CIMetricsWorkflowContext `protobuf:"bytes,2,opt,name=workflow,proto3" json:"workflow,omitempty"` - Job *CIMetricsJobContext `protobuf:"bytes,3,opt,name=job,proto3" json:"job,omitempty"` - Attempt *CIMetricsAttemptMetrics `protobuf:"bytes,4,opt,name=attempt,proto3" json:"attempt,omitempty"` - // snapshot_at is the request timestamp used as the upper bound for running attempts. - SnapshotAt string `protobuf:"bytes,5,opt,name=snapshot_at,json=snapshotAt,proto3" json:"snapshot_at,omitempty"` + TargetId string `protobuf:"bytes,1,opt,name=target_id,json=targetId,proto3" json:"target_id,omitempty"` + TargetType FailureDiagnosisTargetType `protobuf:"varint,2,opt,name=target_type,json=targetType,proto3,enum=depot.ci.v1.FailureDiagnosisTargetType" json:"target_type,omitempty"` + Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` } -func (x *GetJobAttemptMetricsResponse) Reset() { - *x = GetJobAttemptMetricsResponse{} +func (x *FailureDiagnosisTarget) Reset() { + *x = FailureDiagnosisTarget{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[38] + mi := &file_depot_ci_v1_ci_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetJobAttemptMetricsResponse) String() string { +func (x *FailureDiagnosisTarget) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetJobAttemptMetricsResponse) ProtoMessage() {} +func (*FailureDiagnosisTarget) ProtoMessage() {} -func (x *GetJobAttemptMetricsResponse) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[38] +func (x *FailureDiagnosisTarget) ProtoReflect() protoreflect.Message { + mi := &file_depot_ci_v1_ci_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2800,76 +3001,77 @@ func (x *GetJobAttemptMetricsResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetJobAttemptMetricsResponse.ProtoReflect.Descriptor instead. -func (*GetJobAttemptMetricsResponse) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{38} -} - -func (x *GetJobAttemptMetricsResponse) GetRun() *CIMetricsRunContext { - if x != nil { - return x.Run - } - return nil -} - -func (x *GetJobAttemptMetricsResponse) GetWorkflow() *CIMetricsWorkflowContext { - if x != nil { - return x.Workflow - } - return nil +// Deprecated: Use FailureDiagnosisTarget.ProtoReflect.Descriptor instead. +func (*FailureDiagnosisTarget) Descriptor() ([]byte, []int) { + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{37} } -func (x *GetJobAttemptMetricsResponse) GetJob() *CIMetricsJobContext { +func (x *FailureDiagnosisTarget) GetTargetId() string { if x != nil { - return x.Job + return x.TargetId } - return nil + return "" } -func (x *GetJobAttemptMetricsResponse) GetAttempt() *CIMetricsAttemptMetrics { +func (x *FailureDiagnosisTarget) GetTargetType() FailureDiagnosisTargetType { if x != nil { - return x.Attempt + return x.TargetType } - return nil + return FailureDiagnosisTargetType_FAILURE_DIAGNOSIS_TARGET_TYPE_UNSPECIFIED } -func (x *GetJobAttemptMetricsResponse) GetSnapshotAt() string { +func (x *FailureDiagnosisTarget) GetStatus() string { if x != nil { - return x.SnapshotAt + return x.Status } return "" } -type GetJobMetricsResponse struct { +type FailureDiagnosisContext struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Run *CIMetricsRunContext `protobuf:"bytes,1,opt,name=run,proto3" json:"run,omitempty"` - Workflow *CIMetricsWorkflowContext `protobuf:"bytes,2,opt,name=workflow,proto3" json:"workflow,omitempty"` - Job *CIMetricsJobContext `protobuf:"bytes,3,opt,name=job,proto3" json:"job,omitempty"` - Attempts []*CIMetricsAttemptSummary `protobuf:"bytes,4,rep,name=attempts,proto3" json:"attempts,omitempty"` - // snapshot_at is the request timestamp used as the upper bound for running attempts. - SnapshotAt string `protobuf:"bytes,5,opt,name=snapshot_at,json=snapshotAt,proto3" json:"snapshot_at,omitempty"` -} - -func (x *GetJobMetricsResponse) Reset() { - *x = GetJobMetricsResponse{} + RunId string `protobuf:"bytes,1,opt,name=run_id,json=runId,proto3" json:"run_id,omitempty"` + Repo string `protobuf:"bytes,2,opt,name=repo,proto3" json:"repo,omitempty"` + Ref string `protobuf:"bytes,3,opt,name=ref,proto3" json:"ref,omitempty"` + Sha string `protobuf:"bytes,4,opt,name=sha,proto3" json:"sha,omitempty"` + HeadSha string `protobuf:"bytes,5,opt,name=head_sha,json=headSha,proto3" json:"head_sha,omitempty"` + Trigger string `protobuf:"bytes,6,opt,name=trigger,proto3" json:"trigger,omitempty"` + RunStatus string `protobuf:"bytes,7,opt,name=run_status,json=runStatus,proto3" json:"run_status,omitempty"` + WorkflowId string `protobuf:"bytes,8,opt,name=workflow_id,json=workflowId,proto3" json:"workflow_id,omitempty"` + WorkflowName string `protobuf:"bytes,9,opt,name=workflow_name,json=workflowName,proto3" json:"workflow_name,omitempty"` + WorkflowPath string `protobuf:"bytes,10,opt,name=workflow_path,json=workflowPath,proto3" json:"workflow_path,omitempty"` + WorkflowStatus string `protobuf:"bytes,11,opt,name=workflow_status,json=workflowStatus,proto3" json:"workflow_status,omitempty"` + JobId string `protobuf:"bytes,12,opt,name=job_id,json=jobId,proto3" json:"job_id,omitempty"` + JobKey string `protobuf:"bytes,13,opt,name=job_key,json=jobKey,proto3" json:"job_key,omitempty"` + JobDisplayName string `protobuf:"bytes,14,opt,name=job_display_name,json=jobDisplayName,proto3" json:"job_display_name,omitempty"` + JobStatus string `protobuf:"bytes,15,opt,name=job_status,json=jobStatus,proto3" json:"job_status,omitempty"` + JobConclusion string `protobuf:"bytes,16,opt,name=job_conclusion,json=jobConclusion,proto3" json:"job_conclusion,omitempty"` + AttemptId string `protobuf:"bytes,17,opt,name=attempt_id,json=attemptId,proto3" json:"attempt_id,omitempty"` + Attempt int32 `protobuf:"varint,18,opt,name=attempt,proto3" json:"attempt,omitempty"` + AttemptStatus string `protobuf:"bytes,19,opt,name=attempt_status,json=attemptStatus,proto3" json:"attempt_status,omitempty"` + AttemptConclusion string `protobuf:"bytes,20,opt,name=attempt_conclusion,json=attemptConclusion,proto3" json:"attempt_conclusion,omitempty"` + TruncatedContextFields []string `protobuf:"bytes,21,rep,name=truncated_context_fields,json=truncatedContextFields,proto3" json:"truncated_context_fields,omitempty"` +} + +func (x *FailureDiagnosisContext) Reset() { + *x = FailureDiagnosisContext{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[39] + mi := &file_depot_ci_v1_ci_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetJobMetricsResponse) String() string { +func (x *FailureDiagnosisContext) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetJobMetricsResponse) ProtoMessage() {} +func (*FailureDiagnosisContext) ProtoMessage() {} -func (x *GetJobMetricsResponse) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[39] +func (x *FailureDiagnosisContext) ProtoReflect() protoreflect.Message { + mi := &file_depot_ci_v1_ci_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2880,23 +3082,1256 @@ func (x *GetJobMetricsResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetJobMetricsResponse.ProtoReflect.Descriptor instead. -func (*GetJobMetricsResponse) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{39} +// Deprecated: Use FailureDiagnosisContext.ProtoReflect.Descriptor instead. +func (*FailureDiagnosisContext) Descriptor() ([]byte, []int) { + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{38} } -func (x *GetJobMetricsResponse) GetRun() *CIMetricsRunContext { +func (x *FailureDiagnosisContext) GetRunId() string { if x != nil { - return x.Run + return x.RunId } - return nil + return "" } -func (x *GetJobMetricsResponse) GetWorkflow() *CIMetricsWorkflowContext { +func (x *FailureDiagnosisContext) GetRepo() string { if x != nil { - return x.Workflow + return x.Repo } - return nil + return "" +} + +func (x *FailureDiagnosisContext) GetRef() string { + if x != nil { + return x.Ref + } + return "" +} + +func (x *FailureDiagnosisContext) GetSha() string { + if x != nil { + return x.Sha + } + return "" +} + +func (x *FailureDiagnosisContext) GetHeadSha() string { + if x != nil { + return x.HeadSha + } + return "" +} + +func (x *FailureDiagnosisContext) GetTrigger() string { + if x != nil { + return x.Trigger + } + return "" +} + +func (x *FailureDiagnosisContext) GetRunStatus() string { + if x != nil { + return x.RunStatus + } + return "" +} + +func (x *FailureDiagnosisContext) GetWorkflowId() string { + if x != nil { + return x.WorkflowId + } + return "" +} + +func (x *FailureDiagnosisContext) GetWorkflowName() string { + if x != nil { + return x.WorkflowName + } + return "" +} + +func (x *FailureDiagnosisContext) GetWorkflowPath() string { + if x != nil { + return x.WorkflowPath + } + return "" +} + +func (x *FailureDiagnosisContext) GetWorkflowStatus() string { + if x != nil { + return x.WorkflowStatus + } + return "" +} + +func (x *FailureDiagnosisContext) GetJobId() string { + if x != nil { + return x.JobId + } + return "" +} + +func (x *FailureDiagnosisContext) GetJobKey() string { + if x != nil { + return x.JobKey + } + return "" +} + +func (x *FailureDiagnosisContext) GetJobDisplayName() string { + if x != nil { + return x.JobDisplayName + } + return "" +} + +func (x *FailureDiagnosisContext) GetJobStatus() string { + if x != nil { + return x.JobStatus + } + return "" +} + +func (x *FailureDiagnosisContext) GetJobConclusion() string { + if x != nil { + return x.JobConclusion + } + return "" +} + +func (x *FailureDiagnosisContext) GetAttemptId() string { + if x != nil { + return x.AttemptId + } + return "" +} + +func (x *FailureDiagnosisContext) GetAttempt() int32 { + if x != nil { + return x.Attempt + } + return 0 +} + +func (x *FailureDiagnosisContext) GetAttemptStatus() string { + if x != nil { + return x.AttemptStatus + } + return "" +} + +func (x *FailureDiagnosisContext) GetAttemptConclusion() string { + if x != nil { + return x.AttemptConclusion + } + return "" +} + +func (x *FailureDiagnosisContext) GetTruncatedContextFields() []string { + if x != nil { + return x.TruncatedContextFields + } + return nil +} + +type FailureGroup struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Fingerprint string `protobuf:"bytes,1,opt,name=fingerprint,proto3" json:"fingerprint,omitempty"` + Source string `protobuf:"bytes,2,opt,name=source,proto3" json:"source,omitempty"` + Count uint32 `protobuf:"varint,3,opt,name=count,proto3" json:"count,omitempty"` + ErrorMessage string `protobuf:"bytes,4,opt,name=error_message,json=errorMessage,proto3" json:"error_message,omitempty"` + ErrorMessageTruncated bool `protobuf:"varint,5,opt,name=error_message_truncated,json=errorMessageTruncated,proto3" json:"error_message_truncated,omitempty"` + ErrorMessageOriginalLength uint32 `protobuf:"varint,6,opt,name=error_message_original_length,json=errorMessageOriginalLength,proto3" json:"error_message_original_length,omitempty"` + Diagnosis string `protobuf:"bytes,7,opt,name=diagnosis,proto3" json:"diagnosis,omitempty"` + PossibleFix string `protobuf:"bytes,8,opt,name=possible_fix,json=possibleFix,proto3" json:"possible_fix,omitempty"` + Representatives []*RepresentativeAttempt `protobuf:"bytes,9,rep,name=representatives,proto3" json:"representatives,omitempty"` + OmittedRepresentativeCount uint32 `protobuf:"varint,10,opt,name=omitted_representative_count,json=omittedRepresentativeCount,proto3" json:"omitted_representative_count,omitempty"` +} + +func (x *FailureGroup) Reset() { + *x = FailureGroup{} + if protoimpl.UnsafeEnabled { + mi := &file_depot_ci_v1_ci_proto_msgTypes[39] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FailureGroup) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FailureGroup) ProtoMessage() {} + +func (x *FailureGroup) ProtoReflect() protoreflect.Message { + mi := &file_depot_ci_v1_ci_proto_msgTypes[39] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FailureGroup.ProtoReflect.Descriptor instead. +func (*FailureGroup) Descriptor() ([]byte, []int) { + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{39} +} + +func (x *FailureGroup) GetFingerprint() string { + if x != nil { + return x.Fingerprint + } + return "" +} + +func (x *FailureGroup) GetSource() string { + if x != nil { + return x.Source + } + return "" +} + +func (x *FailureGroup) GetCount() uint32 { + if x != nil { + return x.Count + } + return 0 +} + +func (x *FailureGroup) GetErrorMessage() string { + if x != nil { + return x.ErrorMessage + } + return "" +} + +func (x *FailureGroup) GetErrorMessageTruncated() bool { + if x != nil { + return x.ErrorMessageTruncated + } + return false +} + +func (x *FailureGroup) GetErrorMessageOriginalLength() uint32 { + if x != nil { + return x.ErrorMessageOriginalLength + } + return 0 +} + +func (x *FailureGroup) GetDiagnosis() string { + if x != nil { + return x.Diagnosis + } + return "" +} + +func (x *FailureGroup) GetPossibleFix() string { + if x != nil { + return x.PossibleFix + } + return "" +} + +func (x *FailureGroup) GetRepresentatives() []*RepresentativeAttempt { + if x != nil { + return x.Representatives + } + return nil +} + +func (x *FailureGroup) GetOmittedRepresentativeCount() uint32 { + if x != nil { + return x.OmittedRepresentativeCount + } + return 0 +} + +type RepresentativeAttempt struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RunId string `protobuf:"bytes,1,opt,name=run_id,json=runId,proto3" json:"run_id,omitempty"` + WorkflowId string `protobuf:"bytes,2,opt,name=workflow_id,json=workflowId,proto3" json:"workflow_id,omitempty"` + WorkflowName string `protobuf:"bytes,3,opt,name=workflow_name,json=workflowName,proto3" json:"workflow_name,omitempty"` + WorkflowPath string `protobuf:"bytes,4,opt,name=workflow_path,json=workflowPath,proto3" json:"workflow_path,omitempty"` + JobId string `protobuf:"bytes,5,opt,name=job_id,json=jobId,proto3" json:"job_id,omitempty"` + JobKey string `protobuf:"bytes,6,opt,name=job_key,json=jobKey,proto3" json:"job_key,omitempty"` + JobDisplayName string `protobuf:"bytes,7,opt,name=job_display_name,json=jobDisplayName,proto3" json:"job_display_name,omitempty"` + JobStatus string `protobuf:"bytes,8,opt,name=job_status,json=jobStatus,proto3" json:"job_status,omitempty"` + JobConclusion string `protobuf:"bytes,9,opt,name=job_conclusion,json=jobConclusion,proto3" json:"job_conclusion,omitempty"` + AttemptId string `protobuf:"bytes,10,opt,name=attempt_id,json=attemptId,proto3" json:"attempt_id,omitempty"` + Attempt int32 `protobuf:"varint,11,opt,name=attempt,proto3" json:"attempt,omitempty"` + AttemptStatus string `protobuf:"bytes,12,opt,name=attempt_status,json=attemptStatus,proto3" json:"attempt_status,omitempty"` + AttemptConclusion string `protobuf:"bytes,13,opt,name=attempt_conclusion,json=attemptConclusion,proto3" json:"attempt_conclusion,omitempty"` + ErrorMessage string `protobuf:"bytes,14,opt,name=error_message,json=errorMessage,proto3" json:"error_message,omitempty"` + ErrorMessageTruncated bool `protobuf:"varint,15,opt,name=error_message_truncated,json=errorMessageTruncated,proto3" json:"error_message_truncated,omitempty"` + ErrorMessageOriginalLength uint32 `protobuf:"varint,16,opt,name=error_message_original_length,json=errorMessageOriginalLength,proto3" json:"error_message_original_length,omitempty"` + Diagnosis string `protobuf:"bytes,17,opt,name=diagnosis,proto3" json:"diagnosis,omitempty"` + PossibleFix string `protobuf:"bytes,18,opt,name=possible_fix,json=possibleFix,proto3" json:"possible_fix,omitempty"` + RelevantLines []*RelevantErrorLine `protobuf:"bytes,19,rep,name=relevant_lines,json=relevantLines,proto3" json:"relevant_lines,omitempty"` + NextCommands []*DrillDownCommand `protobuf:"bytes,20,rep,name=next_commands,json=nextCommands,proto3" json:"next_commands,omitempty"` +} + +func (x *RepresentativeAttempt) Reset() { + *x = RepresentativeAttempt{} + if protoimpl.UnsafeEnabled { + mi := &file_depot_ci_v1_ci_proto_msgTypes[40] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RepresentativeAttempt) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RepresentativeAttempt) ProtoMessage() {} + +func (x *RepresentativeAttempt) ProtoReflect() protoreflect.Message { + mi := &file_depot_ci_v1_ci_proto_msgTypes[40] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RepresentativeAttempt.ProtoReflect.Descriptor instead. +func (*RepresentativeAttempt) Descriptor() ([]byte, []int) { + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{40} +} + +func (x *RepresentativeAttempt) GetRunId() string { + if x != nil { + return x.RunId + } + return "" +} + +func (x *RepresentativeAttempt) GetWorkflowId() string { + if x != nil { + return x.WorkflowId + } + return "" +} + +func (x *RepresentativeAttempt) GetWorkflowName() string { + if x != nil { + return x.WorkflowName + } + return "" +} + +func (x *RepresentativeAttempt) GetWorkflowPath() string { + if x != nil { + return x.WorkflowPath + } + return "" +} + +func (x *RepresentativeAttempt) GetJobId() string { + if x != nil { + return x.JobId + } + return "" +} + +func (x *RepresentativeAttempt) GetJobKey() string { + if x != nil { + return x.JobKey + } + return "" +} + +func (x *RepresentativeAttempt) GetJobDisplayName() string { + if x != nil { + return x.JobDisplayName + } + return "" +} + +func (x *RepresentativeAttempt) GetJobStatus() string { + if x != nil { + return x.JobStatus + } + return "" +} + +func (x *RepresentativeAttempt) GetJobConclusion() string { + if x != nil { + return x.JobConclusion + } + return "" +} + +func (x *RepresentativeAttempt) GetAttemptId() string { + if x != nil { + return x.AttemptId + } + return "" +} + +func (x *RepresentativeAttempt) GetAttempt() int32 { + if x != nil { + return x.Attempt + } + return 0 +} + +func (x *RepresentativeAttempt) GetAttemptStatus() string { + if x != nil { + return x.AttemptStatus + } + return "" +} + +func (x *RepresentativeAttempt) GetAttemptConclusion() string { + if x != nil { + return x.AttemptConclusion + } + return "" +} + +func (x *RepresentativeAttempt) GetErrorMessage() string { + if x != nil { + return x.ErrorMessage + } + return "" +} + +func (x *RepresentativeAttempt) GetErrorMessageTruncated() bool { + if x != nil { + return x.ErrorMessageTruncated + } + return false +} + +func (x *RepresentativeAttempt) GetErrorMessageOriginalLength() uint32 { + if x != nil { + return x.ErrorMessageOriginalLength + } + return 0 +} + +func (x *RepresentativeAttempt) GetDiagnosis() string { + if x != nil { + return x.Diagnosis + } + return "" +} + +func (x *RepresentativeAttempt) GetPossibleFix() string { + if x != nil { + return x.PossibleFix + } + return "" +} + +func (x *RepresentativeAttempt) GetRelevantLines() []*RelevantErrorLine { + if x != nil { + return x.RelevantLines + } + return nil +} + +func (x *RepresentativeAttempt) GetNextCommands() []*DrillDownCommand { + if x != nil { + return x.NextCommands + } + return nil +} + +type RelevantErrorLine struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + StepId string `protobuf:"bytes,1,opt,name=step_id,json=stepId,proto3" json:"step_id,omitempty"` + LineNumber uint32 `protobuf:"varint,2,opt,name=line_number,json=lineNumber,proto3" json:"line_number,omitempty"` + Content string `protobuf:"bytes,3,opt,name=content,proto3" json:"content,omitempty"` + ContentTruncated bool `protobuf:"varint,4,opt,name=content_truncated,json=contentTruncated,proto3" json:"content_truncated,omitempty"` + ContentOriginalLength uint32 `protobuf:"varint,5,opt,name=content_original_length,json=contentOriginalLength,proto3" json:"content_original_length,omitempty"` +} + +func (x *RelevantErrorLine) Reset() { + *x = RelevantErrorLine{} + if protoimpl.UnsafeEnabled { + mi := &file_depot_ci_v1_ci_proto_msgTypes[41] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RelevantErrorLine) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RelevantErrorLine) ProtoMessage() {} + +func (x *RelevantErrorLine) ProtoReflect() protoreflect.Message { + mi := &file_depot_ci_v1_ci_proto_msgTypes[41] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RelevantErrorLine.ProtoReflect.Descriptor instead. +func (*RelevantErrorLine) Descriptor() ([]byte, []int) { + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{41} +} + +func (x *RelevantErrorLine) GetStepId() string { + if x != nil { + return x.StepId + } + return "" +} + +func (x *RelevantErrorLine) GetLineNumber() uint32 { + if x != nil { + return x.LineNumber + } + return 0 +} + +func (x *RelevantErrorLine) GetContent() string { + if x != nil { + return x.Content + } + return "" +} + +func (x *RelevantErrorLine) GetContentTruncated() bool { + if x != nil { + return x.ContentTruncated + } + return false +} + +func (x *RelevantErrorLine) GetContentOriginalLength() uint32 { + if x != nil { + return x.ContentOriginalLength + } + return 0 +} + +type FailureDiagnosisBounds struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FailedProblemCandidateCount uint32 `protobuf:"varint,1,opt,name=failed_problem_candidate_count,json=failedProblemCandidateCount,proto3" json:"failed_problem_candidate_count,omitempty"` + FailedProblemCandidateCap uint32 `protobuf:"varint,2,opt,name=failed_problem_candidate_cap,json=failedProblemCandidateCap,proto3" json:"failed_problem_candidate_cap,omitempty"` + TotalProblemJobCount uint32 `protobuf:"varint,3,opt,name=total_problem_job_count,json=totalProblemJobCount,proto3" json:"total_problem_job_count,omitempty"` + SkippedDependentCount uint32 `protobuf:"varint,4,opt,name=skipped_dependent_count,json=skippedDependentCount,proto3" json:"skipped_dependent_count,omitempty"` + TotalFailureGroupCount uint32 `protobuf:"varint,5,opt,name=total_failure_group_count,json=totalFailureGroupCount,proto3" json:"total_failure_group_count,omitempty"` + OmittedFailureGroupCount uint32 `protobuf:"varint,6,opt,name=omitted_failure_group_count,json=omittedFailureGroupCount,proto3" json:"omitted_failure_group_count,omitempty"` + FailureGroupLimit uint32 `protobuf:"varint,7,opt,name=failure_group_limit,json=failureGroupLimit,proto3" json:"failure_group_limit,omitempty"` + RepresentativesPerGroupLimit uint32 `protobuf:"varint,8,opt,name=representatives_per_group_limit,json=representativesPerGroupLimit,proto3" json:"representatives_per_group_limit,omitempty"` + RecentAttemptLimit uint32 `protobuf:"varint,9,opt,name=recent_attempt_limit,json=recentAttemptLimit,proto3" json:"recent_attempt_limit,omitempty"` + TotalAttemptCount uint32 `protobuf:"varint,10,opt,name=total_attempt_count,json=totalAttemptCount,proto3" json:"total_attempt_count,omitempty"` + OmittedAttemptCount uint32 `protobuf:"varint,11,opt,name=omitted_attempt_count,json=omittedAttemptCount,proto3" json:"omitted_attempt_count,omitempty"` + RelevantLineLimit uint32 `protobuf:"varint,12,opt,name=relevant_line_limit,json=relevantLineLimit,proto3" json:"relevant_line_limit,omitempty"` + ErrorLineBodyCharLimit uint32 `protobuf:"varint,13,opt,name=error_line_body_char_limit,json=errorLineBodyCharLimit,proto3" json:"error_line_body_char_limit,omitempty"` + ErrorMessageCharLimit uint32 `protobuf:"varint,14,opt,name=error_message_char_limit,json=errorMessageCharLimit,proto3" json:"error_message_char_limit,omitempty"` + ContextLabelCharLimit uint32 `protobuf:"varint,15,opt,name=context_label_char_limit,json=contextLabelCharLimit,proto3" json:"context_label_char_limit,omitempty"` + OverLimitWorkflowBreakdownLimit uint32 `protobuf:"varint,16,opt,name=over_limit_workflow_breakdown_limit,json=overLimitWorkflowBreakdownLimit,proto3" json:"over_limit_workflow_breakdown_limit,omitempty"` + OverLimitJobBreakdownLimit uint32 `protobuf:"varint,17,opt,name=over_limit_job_breakdown_limit,json=overLimitJobBreakdownLimit,proto3" json:"over_limit_job_breakdown_limit,omitempty"` + OmittedWorkflowBreakdownCount uint32 `protobuf:"varint,18,opt,name=omitted_workflow_breakdown_count,json=omittedWorkflowBreakdownCount,proto3" json:"omitted_workflow_breakdown_count,omitempty"` + OmittedJobBreakdownCount uint32 `protobuf:"varint,19,opt,name=omitted_job_breakdown_count,json=omittedJobBreakdownCount,proto3" json:"omitted_job_breakdown_count,omitempty"` + Truncated bool `protobuf:"varint,20,opt,name=truncated,proto3" json:"truncated,omitempty"` +} + +func (x *FailureDiagnosisBounds) Reset() { + *x = FailureDiagnosisBounds{} + if protoimpl.UnsafeEnabled { + mi := &file_depot_ci_v1_ci_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FailureDiagnosisBounds) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FailureDiagnosisBounds) ProtoMessage() {} + +func (x *FailureDiagnosisBounds) ProtoReflect() protoreflect.Message { + mi := &file_depot_ci_v1_ci_proto_msgTypes[42] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FailureDiagnosisBounds.ProtoReflect.Descriptor instead. +func (*FailureDiagnosisBounds) Descriptor() ([]byte, []int) { + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{42} +} + +func (x *FailureDiagnosisBounds) GetFailedProblemCandidateCount() uint32 { + if x != nil { + return x.FailedProblemCandidateCount + } + return 0 +} + +func (x *FailureDiagnosisBounds) GetFailedProblemCandidateCap() uint32 { + if x != nil { + return x.FailedProblemCandidateCap + } + return 0 +} + +func (x *FailureDiagnosisBounds) GetTotalProblemJobCount() uint32 { + if x != nil { + return x.TotalProblemJobCount + } + return 0 +} + +func (x *FailureDiagnosisBounds) GetSkippedDependentCount() uint32 { + if x != nil { + return x.SkippedDependentCount + } + return 0 +} + +func (x *FailureDiagnosisBounds) GetTotalFailureGroupCount() uint32 { + if x != nil { + return x.TotalFailureGroupCount + } + return 0 +} + +func (x *FailureDiagnosisBounds) GetOmittedFailureGroupCount() uint32 { + if x != nil { + return x.OmittedFailureGroupCount + } + return 0 +} + +func (x *FailureDiagnosisBounds) GetFailureGroupLimit() uint32 { + if x != nil { + return x.FailureGroupLimit + } + return 0 +} + +func (x *FailureDiagnosisBounds) GetRepresentativesPerGroupLimit() uint32 { + if x != nil { + return x.RepresentativesPerGroupLimit + } + return 0 +} + +func (x *FailureDiagnosisBounds) GetRecentAttemptLimit() uint32 { + if x != nil { + return x.RecentAttemptLimit + } + return 0 +} + +func (x *FailureDiagnosisBounds) GetTotalAttemptCount() uint32 { + if x != nil { + return x.TotalAttemptCount + } + return 0 +} + +func (x *FailureDiagnosisBounds) GetOmittedAttemptCount() uint32 { + if x != nil { + return x.OmittedAttemptCount + } + return 0 +} + +func (x *FailureDiagnosisBounds) GetRelevantLineLimit() uint32 { + if x != nil { + return x.RelevantLineLimit + } + return 0 +} + +func (x *FailureDiagnosisBounds) GetErrorLineBodyCharLimit() uint32 { + if x != nil { + return x.ErrorLineBodyCharLimit + } + return 0 +} + +func (x *FailureDiagnosisBounds) GetErrorMessageCharLimit() uint32 { + if x != nil { + return x.ErrorMessageCharLimit + } + return 0 +} + +func (x *FailureDiagnosisBounds) GetContextLabelCharLimit() uint32 { + if x != nil { + return x.ContextLabelCharLimit + } + return 0 +} + +func (x *FailureDiagnosisBounds) GetOverLimitWorkflowBreakdownLimit() uint32 { + if x != nil { + return x.OverLimitWorkflowBreakdownLimit + } + return 0 +} + +func (x *FailureDiagnosisBounds) GetOverLimitJobBreakdownLimit() uint32 { + if x != nil { + return x.OverLimitJobBreakdownLimit + } + return 0 +} + +func (x *FailureDiagnosisBounds) GetOmittedWorkflowBreakdownCount() uint32 { + if x != nil { + return x.OmittedWorkflowBreakdownCount + } + return 0 +} + +func (x *FailureDiagnosisBounds) GetOmittedJobBreakdownCount() uint32 { + if x != nil { + return x.OmittedJobBreakdownCount + } + return 0 +} + +func (x *FailureDiagnosisBounds) GetTruncated() bool { + if x != nil { + return x.Truncated + } + return false +} + +type DrillDownCommand struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Kind DrillDownCommandKind `protobuf:"varint,1,opt,name=kind,proto3,enum=depot.ci.v1.DrillDownCommandKind" json:"kind,omitempty"` + Available bool `protobuf:"varint,2,opt,name=available,proto3" json:"available,omitempty"` + UnavailableReason string `protobuf:"bytes,3,opt,name=unavailable_reason,json=unavailableReason,proto3" json:"unavailable_reason,omitempty"` + Argv []string `protobuf:"bytes,4,rep,name=argv,proto3" json:"argv,omitempty"` + TargetId string `protobuf:"bytes,5,opt,name=target_id,json=targetId,proto3" json:"target_id,omitempty"` + Label string `protobuf:"bytes,6,opt,name=label,proto3" json:"label,omitempty"` +} + +func (x *DrillDownCommand) Reset() { + *x = DrillDownCommand{} + if protoimpl.UnsafeEnabled { + mi := &file_depot_ci_v1_ci_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DrillDownCommand) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DrillDownCommand) ProtoMessage() {} + +func (x *DrillDownCommand) ProtoReflect() protoreflect.Message { + mi := &file_depot_ci_v1_ci_proto_msgTypes[43] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DrillDownCommand.ProtoReflect.Descriptor instead. +func (*DrillDownCommand) Descriptor() ([]byte, []int) { + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{43} +} + +func (x *DrillDownCommand) GetKind() DrillDownCommandKind { + if x != nil { + return x.Kind + } + return DrillDownCommandKind_DRILL_DOWN_COMMAND_KIND_UNSPECIFIED +} + +func (x *DrillDownCommand) GetAvailable() bool { + if x != nil { + return x.Available + } + return false +} + +func (x *DrillDownCommand) GetUnavailableReason() string { + if x != nil { + return x.UnavailableReason + } + return "" +} + +func (x *DrillDownCommand) GetArgv() []string { + if x != nil { + return x.Argv + } + return nil +} + +func (x *DrillDownCommand) GetTargetId() string { + if x != nil { + return x.TargetId + } + return "" +} + +func (x *DrillDownCommand) GetLabel() string { + if x != nil { + return x.Label + } + return "" +} + +type FailureDiagnosisCommandCapabilities struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SummaryCommandAvailable bool `protobuf:"varint,1,opt,name=summary_command_available,json=summaryCommandAvailable,proto3" json:"summary_command_available,omitempty"` +} + +func (x *FailureDiagnosisCommandCapabilities) Reset() { + *x = FailureDiagnosisCommandCapabilities{} + if protoimpl.UnsafeEnabled { + mi := &file_depot_ci_v1_ci_proto_msgTypes[44] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FailureDiagnosisCommandCapabilities) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FailureDiagnosisCommandCapabilities) ProtoMessage() {} + +func (x *FailureDiagnosisCommandCapabilities) ProtoReflect() protoreflect.Message { + mi := &file_depot_ci_v1_ci_proto_msgTypes[44] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FailureDiagnosisCommandCapabilities.ProtoReflect.Descriptor instead. +func (*FailureDiagnosisCommandCapabilities) Descriptor() ([]byte, []int) { + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{44} +} + +func (x *FailureDiagnosisCommandCapabilities) GetSummaryCommandAvailable() bool { + if x != nil { + return x.SummaryCommandAvailable + } + return false +} + +type FailureDiagnosisBreakdownRow struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TargetType FailureDiagnosisTargetType `protobuf:"varint,1,opt,name=target_type,json=targetType,proto3,enum=depot.ci.v1.FailureDiagnosisTargetType" json:"target_type,omitempty"` + TargetId string `protobuf:"bytes,2,opt,name=target_id,json=targetId,proto3" json:"target_id,omitempty"` + Label string `protobuf:"bytes,3,opt,name=label,proto3" json:"label,omitempty"` + Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` + FailedProblemCandidateCount uint32 `protobuf:"varint,5,opt,name=failed_problem_candidate_count,json=failedProblemCandidateCount,proto3" json:"failed_problem_candidate_count,omitempty"` + NextCommands []*DrillDownCommand `protobuf:"bytes,6,rep,name=next_commands,json=nextCommands,proto3" json:"next_commands,omitempty"` +} + +func (x *FailureDiagnosisBreakdownRow) Reset() { + *x = FailureDiagnosisBreakdownRow{} + if protoimpl.UnsafeEnabled { + mi := &file_depot_ci_v1_ci_proto_msgTypes[45] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FailureDiagnosisBreakdownRow) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FailureDiagnosisBreakdownRow) ProtoMessage() {} + +func (x *FailureDiagnosisBreakdownRow) ProtoReflect() protoreflect.Message { + mi := &file_depot_ci_v1_ci_proto_msgTypes[45] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FailureDiagnosisBreakdownRow.ProtoReflect.Descriptor instead. +func (*FailureDiagnosisBreakdownRow) Descriptor() ([]byte, []int) { + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{45} +} + +func (x *FailureDiagnosisBreakdownRow) GetTargetType() FailureDiagnosisTargetType { + if x != nil { + return x.TargetType + } + return FailureDiagnosisTargetType_FAILURE_DIAGNOSIS_TARGET_TYPE_UNSPECIFIED +} + +func (x *FailureDiagnosisBreakdownRow) GetTargetId() string { + if x != nil { + return x.TargetId + } + return "" +} + +func (x *FailureDiagnosisBreakdownRow) GetLabel() string { + if x != nil { + return x.Label + } + return "" +} + +func (x *FailureDiagnosisBreakdownRow) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *FailureDiagnosisBreakdownRow) GetFailedProblemCandidateCount() uint32 { + if x != nil { + return x.FailedProblemCandidateCount + } + return 0 +} + +func (x *FailureDiagnosisBreakdownRow) GetNextCommands() []*DrillDownCommand { + if x != nil { + return x.NextCommands + } + return nil +} + +type GetJobAttemptMetricsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // attempt_id identifies the concrete job attempt whose metric samples to fetch. + AttemptId string `protobuf:"bytes,1,opt,name=attempt_id,json=attemptId,proto3" json:"attempt_id,omitempty"` +} + +func (x *GetJobAttemptMetricsRequest) Reset() { + *x = GetJobAttemptMetricsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_depot_ci_v1_ci_proto_msgTypes[46] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetJobAttemptMetricsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetJobAttemptMetricsRequest) ProtoMessage() {} + +func (x *GetJobAttemptMetricsRequest) ProtoReflect() protoreflect.Message { + mi := &file_depot_ci_v1_ci_proto_msgTypes[46] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetJobAttemptMetricsRequest.ProtoReflect.Descriptor instead. +func (*GetJobAttemptMetricsRequest) Descriptor() ([]byte, []int) { + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{46} +} + +func (x *GetJobAttemptMetricsRequest) GetAttemptId() string { + if x != nil { + return x.AttemptId + } + return "" +} + +type GetJobMetricsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // job_id identifies the job whose attempts should be summarized. + JobId string `protobuf:"bytes,1,opt,name=job_id,json=jobId,proto3" json:"job_id,omitempty"` +} + +func (x *GetJobMetricsRequest) Reset() { + *x = GetJobMetricsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_depot_ci_v1_ci_proto_msgTypes[47] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetJobMetricsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetJobMetricsRequest) ProtoMessage() {} + +func (x *GetJobMetricsRequest) ProtoReflect() protoreflect.Message { + mi := &file_depot_ci_v1_ci_proto_msgTypes[47] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetJobMetricsRequest.ProtoReflect.Descriptor instead. +func (*GetJobMetricsRequest) Descriptor() ([]byte, []int) { + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{47} +} + +func (x *GetJobMetricsRequest) GetJobId() string { + if x != nil { + return x.JobId + } + return "" +} + +type GetRunMetricsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // run_id identifies the run whose workflow/job/attempt metrics should be summarized. + RunId string `protobuf:"bytes,1,opt,name=run_id,json=runId,proto3" json:"run_id,omitempty"` +} + +func (x *GetRunMetricsRequest) Reset() { + *x = GetRunMetricsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_depot_ci_v1_ci_proto_msgTypes[48] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetRunMetricsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetRunMetricsRequest) ProtoMessage() {} + +func (x *GetRunMetricsRequest) ProtoReflect() protoreflect.Message { + mi := &file_depot_ci_v1_ci_proto_msgTypes[48] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetRunMetricsRequest.ProtoReflect.Descriptor instead. +func (*GetRunMetricsRequest) Descriptor() ([]byte, []int) { + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{48} +} + +func (x *GetRunMetricsRequest) GetRunId() string { + if x != nil { + return x.RunId + } + return "" +} + +type GetJobAttemptMetricsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Run *CIMetricsRunContext `protobuf:"bytes,1,opt,name=run,proto3" json:"run,omitempty"` + Workflow *CIMetricsWorkflowContext `protobuf:"bytes,2,opt,name=workflow,proto3" json:"workflow,omitempty"` + Job *CIMetricsJobContext `protobuf:"bytes,3,opt,name=job,proto3" json:"job,omitempty"` + Attempt *CIMetricsAttemptMetrics `protobuf:"bytes,4,opt,name=attempt,proto3" json:"attempt,omitempty"` + // snapshot_at is the request timestamp used as the upper bound for running attempts. + SnapshotAt string `protobuf:"bytes,5,opt,name=snapshot_at,json=snapshotAt,proto3" json:"snapshot_at,omitempty"` +} + +func (x *GetJobAttemptMetricsResponse) Reset() { + *x = GetJobAttemptMetricsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_depot_ci_v1_ci_proto_msgTypes[49] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetJobAttemptMetricsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetJobAttemptMetricsResponse) ProtoMessage() {} + +func (x *GetJobAttemptMetricsResponse) ProtoReflect() protoreflect.Message { + mi := &file_depot_ci_v1_ci_proto_msgTypes[49] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetJobAttemptMetricsResponse.ProtoReflect.Descriptor instead. +func (*GetJobAttemptMetricsResponse) Descriptor() ([]byte, []int) { + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{49} +} + +func (x *GetJobAttemptMetricsResponse) GetRun() *CIMetricsRunContext { + if x != nil { + return x.Run + } + return nil +} + +func (x *GetJobAttemptMetricsResponse) GetWorkflow() *CIMetricsWorkflowContext { + if x != nil { + return x.Workflow + } + return nil +} + +func (x *GetJobAttemptMetricsResponse) GetJob() *CIMetricsJobContext { + if x != nil { + return x.Job + } + return nil +} + +func (x *GetJobAttemptMetricsResponse) GetAttempt() *CIMetricsAttemptMetrics { + if x != nil { + return x.Attempt + } + return nil +} + +func (x *GetJobAttemptMetricsResponse) GetSnapshotAt() string { + if x != nil { + return x.SnapshotAt + } + return "" +} + +type GetJobMetricsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Run *CIMetricsRunContext `protobuf:"bytes,1,opt,name=run,proto3" json:"run,omitempty"` + Workflow *CIMetricsWorkflowContext `protobuf:"bytes,2,opt,name=workflow,proto3" json:"workflow,omitempty"` + Job *CIMetricsJobContext `protobuf:"bytes,3,opt,name=job,proto3" json:"job,omitempty"` + Attempts []*CIMetricsAttemptSummary `protobuf:"bytes,4,rep,name=attempts,proto3" json:"attempts,omitempty"` + // snapshot_at is the request timestamp used as the upper bound for running attempts. + SnapshotAt string `protobuf:"bytes,5,opt,name=snapshot_at,json=snapshotAt,proto3" json:"snapshot_at,omitempty"` +} + +func (x *GetJobMetricsResponse) Reset() { + *x = GetJobMetricsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_depot_ci_v1_ci_proto_msgTypes[50] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetJobMetricsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetJobMetricsResponse) ProtoMessage() {} + +func (x *GetJobMetricsResponse) ProtoReflect() protoreflect.Message { + mi := &file_depot_ci_v1_ci_proto_msgTypes[50] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetJobMetricsResponse.ProtoReflect.Descriptor instead. +func (*GetJobMetricsResponse) Descriptor() ([]byte, []int) { + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{50} +} + +func (x *GetJobMetricsResponse) GetRun() *CIMetricsRunContext { + if x != nil { + return x.Run + } + return nil +} + +func (x *GetJobMetricsResponse) GetWorkflow() *CIMetricsWorkflowContext { + if x != nil { + return x.Workflow + } + return nil } func (x *GetJobMetricsResponse) GetJob() *CIMetricsJobContext { @@ -2934,7 +4369,7 @@ type GetRunMetricsResponse struct { func (x *GetRunMetricsResponse) Reset() { *x = GetRunMetricsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[40] + mi := &file_depot_ci_v1_ci_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2947,7 +4382,7 @@ func (x *GetRunMetricsResponse) String() string { func (*GetRunMetricsResponse) ProtoMessage() {} func (x *GetRunMetricsResponse) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[40] + mi := &file_depot_ci_v1_ci_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2960,7 +4395,7 @@ func (x *GetRunMetricsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRunMetricsResponse.ProtoReflect.Descriptor instead. func (*GetRunMetricsResponse) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{40} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{51} } func (x *GetRunMetricsResponse) GetRun() *CIMetricsRunContext { @@ -2996,7 +4431,7 @@ type CIMetricsWorkflowMetrics struct { func (x *CIMetricsWorkflowMetrics) Reset() { *x = CIMetricsWorkflowMetrics{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[41] + mi := &file_depot_ci_v1_ci_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3009,7 +4444,7 @@ func (x *CIMetricsWorkflowMetrics) String() string { func (*CIMetricsWorkflowMetrics) ProtoMessage() {} func (x *CIMetricsWorkflowMetrics) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[41] + mi := &file_depot_ci_v1_ci_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3022,7 +4457,7 @@ func (x *CIMetricsWorkflowMetrics) ProtoReflect() protoreflect.Message { // Deprecated: Use CIMetricsWorkflowMetrics.ProtoReflect.Descriptor instead. func (*CIMetricsWorkflowMetrics) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{41} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{52} } func (x *CIMetricsWorkflowMetrics) GetWorkflow() *CIMetricsWorkflowContext { @@ -3051,7 +4486,7 @@ type CIMetricsJobMetrics struct { func (x *CIMetricsJobMetrics) Reset() { *x = CIMetricsJobMetrics{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[42] + mi := &file_depot_ci_v1_ci_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3064,7 +4499,7 @@ func (x *CIMetricsJobMetrics) String() string { func (*CIMetricsJobMetrics) ProtoMessage() {} func (x *CIMetricsJobMetrics) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[42] + mi := &file_depot_ci_v1_ci_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3077,7 +4512,7 @@ func (x *CIMetricsJobMetrics) ProtoReflect() protoreflect.Message { // Deprecated: Use CIMetricsJobMetrics.ProtoReflect.Descriptor instead. func (*CIMetricsJobMetrics) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{42} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{53} } func (x *CIMetricsJobMetrics) GetJob() *CIMetricsJobContext { @@ -3109,7 +4544,7 @@ type CIMetricsAttemptMetrics struct { func (x *CIMetricsAttemptMetrics) Reset() { *x = CIMetricsAttemptMetrics{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[43] + mi := &file_depot_ci_v1_ci_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3122,7 +4557,7 @@ func (x *CIMetricsAttemptMetrics) String() string { func (*CIMetricsAttemptMetrics) ProtoMessage() {} func (x *CIMetricsAttemptMetrics) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[43] + mi := &file_depot_ci_v1_ci_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3135,7 +4570,7 @@ func (x *CIMetricsAttemptMetrics) ProtoReflect() protoreflect.Message { // Deprecated: Use CIMetricsAttemptMetrics.ProtoReflect.Descriptor instead. func (*CIMetricsAttemptMetrics) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{43} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{54} } func (x *CIMetricsAttemptMetrics) GetAttempt() *CIMetricsAttemptContext { @@ -3187,7 +4622,7 @@ type CIMetricsAttemptSummary struct { func (x *CIMetricsAttemptSummary) Reset() { *x = CIMetricsAttemptSummary{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[44] + mi := &file_depot_ci_v1_ci_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3200,7 +4635,7 @@ func (x *CIMetricsAttemptSummary) String() string { func (*CIMetricsAttemptSummary) ProtoMessage() {} func (x *CIMetricsAttemptSummary) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[44] + mi := &file_depot_ci_v1_ci_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3213,7 +4648,7 @@ func (x *CIMetricsAttemptSummary) ProtoReflect() protoreflect.Message { // Deprecated: Use CIMetricsAttemptSummary.ProtoReflect.Descriptor instead. func (*CIMetricsAttemptSummary) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{44} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{55} } func (x *CIMetricsAttemptSummary) GetAttempt() *CIMetricsAttemptContext { @@ -3264,7 +4699,7 @@ type CIMetricsRunContext struct { func (x *CIMetricsRunContext) Reset() { *x = CIMetricsRunContext{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[45] + mi := &file_depot_ci_v1_ci_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3277,7 +4712,7 @@ func (x *CIMetricsRunContext) String() string { func (*CIMetricsRunContext) ProtoMessage() {} func (x *CIMetricsRunContext) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[45] + mi := &file_depot_ci_v1_ci_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3290,7 +4725,7 @@ func (x *CIMetricsRunContext) ProtoReflect() protoreflect.Message { // Deprecated: Use CIMetricsRunContext.ProtoReflect.Descriptor instead. func (*CIMetricsRunContext) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{45} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{56} } func (x *CIMetricsRunContext) GetRunId() string { @@ -3380,7 +4815,7 @@ type CIMetricsWorkflowContext struct { func (x *CIMetricsWorkflowContext) Reset() { *x = CIMetricsWorkflowContext{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[46] + mi := &file_depot_ci_v1_ci_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3393,7 +4828,7 @@ func (x *CIMetricsWorkflowContext) String() string { func (*CIMetricsWorkflowContext) ProtoMessage() {} func (x *CIMetricsWorkflowContext) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[46] + mi := &file_depot_ci_v1_ci_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3406,7 +4841,7 @@ func (x *CIMetricsWorkflowContext) ProtoReflect() protoreflect.Message { // Deprecated: Use CIMetricsWorkflowContext.ProtoReflect.Descriptor instead. func (*CIMetricsWorkflowContext) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{46} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{57} } func (x *CIMetricsWorkflowContext) GetWorkflowId() string { @@ -3476,7 +4911,7 @@ type CIMetricsJobContext struct { func (x *CIMetricsJobContext) Reset() { *x = CIMetricsJobContext{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[47] + mi := &file_depot_ci_v1_ci_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3489,7 +4924,7 @@ func (x *CIMetricsJobContext) String() string { func (*CIMetricsJobContext) ProtoMessage() {} func (x *CIMetricsJobContext) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[47] + mi := &file_depot_ci_v1_ci_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3502,7 +4937,7 @@ func (x *CIMetricsJobContext) ProtoReflect() protoreflect.Message { // Deprecated: Use CIMetricsJobContext.ProtoReflect.Descriptor instead. func (*CIMetricsJobContext) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{47} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{58} } func (x *CIMetricsJobContext) GetJobId() string { @@ -3580,7 +5015,7 @@ type CIMetricsAttemptContext struct { func (x *CIMetricsAttemptContext) Reset() { *x = CIMetricsAttemptContext{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[48] + mi := &file_depot_ci_v1_ci_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3593,7 +5028,7 @@ func (x *CIMetricsAttemptContext) String() string { func (*CIMetricsAttemptContext) ProtoMessage() {} func (x *CIMetricsAttemptContext) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[48] + mi := &file_depot_ci_v1_ci_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3606,7 +5041,7 @@ func (x *CIMetricsAttemptContext) ProtoReflect() protoreflect.Message { // Deprecated: Use CIMetricsAttemptContext.ProtoReflect.Descriptor instead. func (*CIMetricsAttemptContext) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{48} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{59} } func (x *CIMetricsAttemptContext) GetAttemptId() string { @@ -3686,7 +5121,7 @@ type CIMetricSample struct { func (x *CIMetricSample) Reset() { *x = CIMetricSample{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[49] + mi := &file_depot_ci_v1_ci_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3699,7 +5134,7 @@ func (x *CIMetricSample) String() string { func (*CIMetricSample) ProtoMessage() {} func (x *CIMetricSample) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[49] + mi := &file_depot_ci_v1_ci_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3712,7 +5147,7 @@ func (x *CIMetricSample) ProtoReflect() protoreflect.Message { // Deprecated: Use CIMetricSample.ProtoReflect.Descriptor instead. func (*CIMetricSample) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{49} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{60} } func (x *CIMetricSample) GetTimestamp() string { @@ -3764,7 +5199,7 @@ type CIMetricsStats struct { func (x *CIMetricsStats) Reset() { *x = CIMetricsStats{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[50] + mi := &file_depot_ci_v1_ci_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3777,7 +5212,7 @@ func (x *CIMetricsStats) String() string { func (*CIMetricsStats) ProtoMessage() {} func (x *CIMetricsStats) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[50] + mi := &file_depot_ci_v1_ci_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3790,7 +5225,7 @@ func (x *CIMetricsStats) ProtoReflect() protoreflect.Message { // Deprecated: Use CIMetricsStats.ProtoReflect.Descriptor instead. func (*CIMetricsStats) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{50} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{61} } func (x *CIMetricsStats) GetSampleCount() uint32 { @@ -3882,7 +5317,7 @@ type CIMetricsAvailability struct { func (x *CIMetricsAvailability) Reset() { *x = CIMetricsAvailability{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[51] + mi := &file_depot_ci_v1_ci_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3895,7 +5330,7 @@ func (x *CIMetricsAvailability) String() string { func (*CIMetricsAvailability) ProtoMessage() {} func (x *CIMetricsAvailability) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[51] + mi := &file_depot_ci_v1_ci_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3908,7 +5343,7 @@ func (x *CIMetricsAvailability) ProtoReflect() protoreflect.Message { // Deprecated: Use CIMetricsAvailability.ProtoReflect.Descriptor instead. func (*CIMetricsAvailability) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{51} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{62} } func (x *CIMetricsAvailability) GetCode() CIMetricsAvailabilityCode { @@ -3940,7 +5375,7 @@ type CIMetricsCapMetadata struct { func (x *CIMetricsCapMetadata) Reset() { *x = CIMetricsCapMetadata{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[52] + mi := &file_depot_ci_v1_ci_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3953,7 +5388,7 @@ func (x *CIMetricsCapMetadata) String() string { func (*CIMetricsCapMetadata) ProtoMessage() {} func (x *CIMetricsCapMetadata) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[52] + mi := &file_depot_ci_v1_ci_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3966,7 +5401,7 @@ func (x *CIMetricsCapMetadata) ProtoReflect() protoreflect.Message { // Deprecated: Use CIMetricsCapMetadata.ProtoReflect.Descriptor instead. func (*CIMetricsCapMetadata) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{52} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{63} } func (x *CIMetricsCapMetadata) GetRawSampleCount() uint32 { @@ -4018,7 +5453,7 @@ type GetJobSummaryRequest struct { func (x *GetJobSummaryRequest) Reset() { *x = GetJobSummaryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[53] + mi := &file_depot_ci_v1_ci_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4031,7 +5466,7 @@ func (x *GetJobSummaryRequest) String() string { func (*GetJobSummaryRequest) ProtoMessage() {} func (x *GetJobSummaryRequest) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[53] + mi := &file_depot_ci_v1_ci_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4044,7 +5479,7 @@ func (x *GetJobSummaryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetJobSummaryRequest.ProtoReflect.Descriptor instead. func (*GetJobSummaryRequest) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{53} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{64} } func (x *GetJobSummaryRequest) GetJobId() string { @@ -4086,7 +5521,7 @@ type GetJobSummaryResponse struct { func (x *GetJobSummaryResponse) Reset() { *x = GetJobSummaryResponse{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[54] + mi := &file_depot_ci_v1_ci_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4099,7 +5534,7 @@ func (x *GetJobSummaryResponse) String() string { func (*GetJobSummaryResponse) ProtoMessage() {} func (x *GetJobSummaryResponse) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[54] + mi := &file_depot_ci_v1_ci_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4112,7 +5547,7 @@ func (x *GetJobSummaryResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetJobSummaryResponse.ProtoReflect.Descriptor instead. func (*GetJobSummaryResponse) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{54} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{65} } func (x *GetJobSummaryResponse) GetOrgId() string { @@ -4213,7 +5648,7 @@ type GetJobAttemptLogsRequest struct { func (x *GetJobAttemptLogsRequest) Reset() { *x = GetJobAttemptLogsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[55] + mi := &file_depot_ci_v1_ci_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4226,7 +5661,7 @@ func (x *GetJobAttemptLogsRequest) String() string { func (*GetJobAttemptLogsRequest) ProtoMessage() {} func (x *GetJobAttemptLogsRequest) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[55] + mi := &file_depot_ci_v1_ci_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4239,7 +5674,7 @@ func (x *GetJobAttemptLogsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetJobAttemptLogsRequest.ProtoReflect.Descriptor instead. func (*GetJobAttemptLogsRequest) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{55} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{66} } func (x *GetJobAttemptLogsRequest) GetAttemptId() string { @@ -4269,7 +5704,7 @@ type GetJobAttemptLogsResponse struct { func (x *GetJobAttemptLogsResponse) Reset() { *x = GetJobAttemptLogsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[56] + mi := &file_depot_ci_v1_ci_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4282,7 +5717,7 @@ func (x *GetJobAttemptLogsResponse) String() string { func (*GetJobAttemptLogsResponse) ProtoMessage() {} func (x *GetJobAttemptLogsResponse) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[56] + mi := &file_depot_ci_v1_ci_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4295,7 +5730,7 @@ func (x *GetJobAttemptLogsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetJobAttemptLogsResponse.ProtoReflect.Descriptor instead. func (*GetJobAttemptLogsResponse) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{56} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{67} } func (x *GetJobAttemptLogsResponse) GetLines() []*LogLine { @@ -4331,7 +5766,7 @@ type StreamJobAttemptLogsRequest struct { func (x *StreamJobAttemptLogsRequest) Reset() { *x = StreamJobAttemptLogsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[57] + mi := &file_depot_ci_v1_ci_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4344,7 +5779,7 @@ func (x *StreamJobAttemptLogsRequest) String() string { func (*StreamJobAttemptLogsRequest) ProtoMessage() {} func (x *StreamJobAttemptLogsRequest) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[57] + mi := &file_depot_ci_v1_ci_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4357,7 +5792,7 @@ func (x *StreamJobAttemptLogsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StreamJobAttemptLogsRequest.ProtoReflect.Descriptor instead. func (*StreamJobAttemptLogsRequest) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{57} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{68} } func (x *StreamJobAttemptLogsRequest) GetAttemptId() string { @@ -4399,7 +5834,7 @@ type StreamJobAttemptLogsResponse struct { func (x *StreamJobAttemptLogsResponse) Reset() { *x = StreamJobAttemptLogsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[58] + mi := &file_depot_ci_v1_ci_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4412,7 +5847,7 @@ func (x *StreamJobAttemptLogsResponse) String() string { func (*StreamJobAttemptLogsResponse) ProtoMessage() {} func (x *StreamJobAttemptLogsResponse) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[58] + mi := &file_depot_ci_v1_ci_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4425,7 +5860,7 @@ func (x *StreamJobAttemptLogsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StreamJobAttemptLogsResponse.ProtoReflect.Descriptor instead. func (*StreamJobAttemptLogsResponse) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{58} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{69} } func (x *StreamJobAttemptLogsResponse) GetLine() *LogLine { @@ -4467,7 +5902,7 @@ type ExportJobAttemptLogsRequest struct { func (x *ExportJobAttemptLogsRequest) Reset() { *x = ExportJobAttemptLogsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[59] + mi := &file_depot_ci_v1_ci_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4480,7 +5915,7 @@ func (x *ExportJobAttemptLogsRequest) String() string { func (*ExportJobAttemptLogsRequest) ProtoMessage() {} func (x *ExportJobAttemptLogsRequest) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[59] + mi := &file_depot_ci_v1_ci_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4493,7 +5928,7 @@ func (x *ExportJobAttemptLogsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ExportJobAttemptLogsRequest.ProtoReflect.Descriptor instead. func (*ExportJobAttemptLogsRequest) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{59} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{70} } func (x *ExportJobAttemptLogsRequest) GetAttemptId() string { @@ -4538,7 +5973,7 @@ type JobAttemptLogExportMetadata struct { func (x *JobAttemptLogExportMetadata) Reset() { *x = JobAttemptLogExportMetadata{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[60] + mi := &file_depot_ci_v1_ci_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4551,7 +5986,7 @@ func (x *JobAttemptLogExportMetadata) String() string { func (*JobAttemptLogExportMetadata) ProtoMessage() {} func (x *JobAttemptLogExportMetadata) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[60] + mi := &file_depot_ci_v1_ci_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4564,7 +5999,7 @@ func (x *JobAttemptLogExportMetadata) ProtoReflect() protoreflect.Message { // Deprecated: Use JobAttemptLogExportMetadata.ProtoReflect.Descriptor instead. func (*JobAttemptLogExportMetadata) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{60} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{71} } func (x *JobAttemptLogExportMetadata) GetFilename() string { @@ -4603,7 +6038,7 @@ type ExportJobAttemptLogsResponse struct { func (x *ExportJobAttemptLogsResponse) Reset() { *x = ExportJobAttemptLogsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[61] + mi := &file_depot_ci_v1_ci_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4616,7 +6051,7 @@ func (x *ExportJobAttemptLogsResponse) String() string { func (*ExportJobAttemptLogsResponse) ProtoMessage() {} func (x *ExportJobAttemptLogsResponse) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[61] + mi := &file_depot_ci_v1_ci_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4629,7 +6064,7 @@ func (x *ExportJobAttemptLogsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ExportJobAttemptLogsResponse.ProtoReflect.Descriptor instead. func (*ExportJobAttemptLogsResponse) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{61} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{72} } func (m *ExportJobAttemptLogsResponse) GetEvent() isExportJobAttemptLogsResponse_Event { @@ -4698,7 +6133,7 @@ type LogLine struct { func (x *LogLine) Reset() { *x = LogLine{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[62] + mi := &file_depot_ci_v1_ci_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4711,7 +6146,7 @@ func (x *LogLine) String() string { func (*LogLine) ProtoMessage() {} func (x *LogLine) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[62] + mi := &file_depot_ci_v1_ci_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4724,7 +6159,7 @@ func (x *LogLine) ProtoReflect() protoreflect.Message { // Deprecated: Use LogLine.ProtoReflect.Descriptor instead. func (*LogLine) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{62} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{73} } func (x *LogLine) GetStepKey() string { @@ -4801,7 +6236,7 @@ type ListRunsRequest struct { func (x *ListRunsRequest) Reset() { *x = ListRunsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[63] + mi := &file_depot_ci_v1_ci_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4814,7 +6249,7 @@ func (x *ListRunsRequest) String() string { func (*ListRunsRequest) ProtoMessage() {} func (x *ListRunsRequest) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[63] + mi := &file_depot_ci_v1_ci_proto_msgTypes[74] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4827,7 +6262,7 @@ func (x *ListRunsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListRunsRequest.ProtoReflect.Descriptor instead. func (*ListRunsRequest) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{63} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{74} } func (x *ListRunsRequest) GetStatus() []string { @@ -4891,7 +6326,7 @@ type ListRunsResponse struct { func (x *ListRunsResponse) Reset() { *x = ListRunsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[64] + mi := &file_depot_ci_v1_ci_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4904,7 +6339,7 @@ func (x *ListRunsResponse) String() string { func (*ListRunsResponse) ProtoMessage() {} func (x *ListRunsResponse) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[64] + mi := &file_depot_ci_v1_ci_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4917,7 +6352,7 @@ func (x *ListRunsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListRunsResponse.ProtoReflect.Descriptor instead. func (*ListRunsResponse) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{64} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{75} } func (x *ListRunsResponse) GetRuns() []*ListRunsResponseRun { @@ -4953,7 +6388,7 @@ type ListRunsResponseRun struct { func (x *ListRunsResponseRun) Reset() { *x = ListRunsResponseRun{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[65] + mi := &file_depot_ci_v1_ci_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4966,7 +6401,7 @@ func (x *ListRunsResponseRun) String() string { func (*ListRunsResponseRun) ProtoMessage() {} func (x *ListRunsResponseRun) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[65] + mi := &file_depot_ci_v1_ci_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4979,7 +6414,7 @@ func (x *ListRunsResponseRun) ProtoReflect() protoreflect.Message { // Deprecated: Use ListRunsResponseRun.ProtoReflect.Descriptor instead. func (*ListRunsResponseRun) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{65} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{76} } func (x *ListRunsResponseRun) GetRunId() string { @@ -5062,7 +6497,7 @@ type ListWorkflowsRequest struct { func (x *ListWorkflowsRequest) Reset() { *x = ListWorkflowsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[66] + mi := &file_depot_ci_v1_ci_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5075,7 +6510,7 @@ func (x *ListWorkflowsRequest) String() string { func (*ListWorkflowsRequest) ProtoMessage() {} func (x *ListWorkflowsRequest) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[66] + mi := &file_depot_ci_v1_ci_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5088,7 +6523,7 @@ func (x *ListWorkflowsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListWorkflowsRequest.ProtoReflect.Descriptor instead. func (*ListWorkflowsRequest) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{66} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{77} } func (x *ListWorkflowsRequest) GetPageSize() int32 { @@ -5151,7 +6586,7 @@ type ListWorkflowsResponse struct { func (x *ListWorkflowsResponse) Reset() { *x = ListWorkflowsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[67] + mi := &file_depot_ci_v1_ci_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5164,7 +6599,7 @@ func (x *ListWorkflowsResponse) String() string { func (*ListWorkflowsResponse) ProtoMessage() {} func (x *ListWorkflowsResponse) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[67] + mi := &file_depot_ci_v1_ci_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5177,7 +6612,7 @@ func (x *ListWorkflowsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListWorkflowsResponse.ProtoReflect.Descriptor instead. func (*ListWorkflowsResponse) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{67} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{78} } func (x *ListWorkflowsResponse) GetWorkflows() []*ListWorkflowsResponseWorkflow { @@ -5209,7 +6644,7 @@ type ListWorkflowsResponseWorkflow struct { func (x *ListWorkflowsResponseWorkflow) Reset() { *x = ListWorkflowsResponseWorkflow{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[68] + mi := &file_depot_ci_v1_ci_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5222,7 +6657,7 @@ func (x *ListWorkflowsResponseWorkflow) String() string { func (*ListWorkflowsResponseWorkflow) ProtoMessage() {} func (x *ListWorkflowsResponseWorkflow) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[68] + mi := &file_depot_ci_v1_ci_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5235,7 +6670,7 @@ func (x *ListWorkflowsResponseWorkflow) ProtoReflect() protoreflect.Message { // Deprecated: Use ListWorkflowsResponseWorkflow.ProtoReflect.Descriptor instead. func (*ListWorkflowsResponseWorkflow) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{68} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{79} } func (x *ListWorkflowsResponseWorkflow) GetWorkflowId() string { @@ -5333,7 +6768,7 @@ type ListWorkflowsResponseJobCounts struct { func (x *ListWorkflowsResponseJobCounts) Reset() { *x = ListWorkflowsResponseJobCounts{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[69] + mi := &file_depot_ci_v1_ci_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5346,7 +6781,7 @@ func (x *ListWorkflowsResponseJobCounts) String() string { func (*ListWorkflowsResponseJobCounts) ProtoMessage() {} func (x *ListWorkflowsResponseJobCounts) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[69] + mi := &file_depot_ci_v1_ci_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5359,7 +6794,7 @@ func (x *ListWorkflowsResponseJobCounts) ProtoReflect() protoreflect.Message { // Deprecated: Use ListWorkflowsResponseJobCounts.ProtoReflect.Descriptor instead. func (*ListWorkflowsResponseJobCounts) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{69} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{80} } func (x *ListWorkflowsResponseJobCounts) GetTotal() int32 { @@ -5735,627 +7170,994 @@ var file_depot_ci_v1_ci_proto_rawDesc = []byte{ 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x41, 0x74, 0x22, 0x3c, - 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, - 0x0a, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x49, 0x64, 0x22, 0x2d, 0x0a, 0x14, - 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x22, 0x2d, 0x0a, 0x14, 0x47, - 0x65, 0x74, 0x52, 0x75, 0x6e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x49, 0x64, 0x22, 0xaa, 0x02, 0x0a, 0x1c, 0x47, - 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x03, 0x72, - 0x75, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, - 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x03, 0x72, 0x75, 0x6e, 0x12, - 0x41, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x25, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x12, 0x32, 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x4a, 0x6f, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, - 0x74, 0x52, 0x03, 0x6a, 0x6f, 0x62, 0x12, 0x3e, 0x0a, 0x07, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, - 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, - 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x41, - 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x07, 0x61, - 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, - 0x6f, 0x74, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6e, 0x61, - 0x70, 0x73, 0x68, 0x6f, 0x74, 0x41, 0x74, 0x22, 0xa5, 0x02, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4a, - 0x6f, 0x62, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x32, 0x0a, 0x03, 0x72, 0x75, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, - 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, - 0x52, 0x03, 0x72, 0x75, 0x6e, 0x12, 0x41, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, - 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x08, - 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x32, 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x4a, 0x6f, 0x62, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x03, 0x6a, 0x6f, 0x62, 0x12, 0x40, 0x0a, 0x08, - 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, - 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x53, 0x75, 0x6d, - 0x6d, 0x61, 0x72, 0x79, 0x52, 0x08, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x12, 0x1f, - 0x0a, 0x0b, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x41, 0x74, 0x22, - 0xb1, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x03, 0x72, 0x75, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x75, - 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x03, 0x72, 0x75, 0x6e, 0x12, 0x43, 0x0a, - 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x25, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x61, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, - 0x74, 0x41, 0x74, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x12, 0x41, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x41, 0x74, 0x22, 0x83, + 0x01, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x44, 0x69, 0x61, + 0x67, 0x6e, 0x6f, 0x73, 0x69, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, + 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x12, 0x48, 0x0a, 0x0b, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x27, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x61, + 0x69, 0x6c, 0x75, 0x72, 0x65, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x69, 0x73, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x22, 0xe5, 0x05, 0x0a, 0x10, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, + 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x69, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x72, 0x67, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x72, 0x67, 0x49, 0x64, + 0x12, 0x3b, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x23, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x46, + 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x69, 0x73, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x3e, 0x0a, + 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, + 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x61, 0x69, + 0x6c, 0x75, 0x72, 0x65, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x69, 0x73, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x38, 0x0a, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x64, + 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x75, + 0x72, 0x65, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x69, 0x73, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x65, 0x6d, 0x70, 0x74, 0x79, + 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, + 0x6d, 0x70, 0x74, 0x79, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x0e, 0x66, 0x61, + 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x06, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x0d, 0x66, + 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x5b, 0x0a, 0x17, + 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x61, + 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, + 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x72, + 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, + 0x74, 0x52, 0x16, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x76, + 0x65, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x12, 0x3b, 0x0a, 0x06, 0x62, 0x6f, 0x75, + 0x6e, 0x64, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x64, 0x65, 0x70, 0x6f, + 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x44, + 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x69, 0x73, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x52, 0x06, + 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x12, 0x42, 0x0a, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x63, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x6c, + 0x6c, 0x44, 0x6f, 0x77, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0c, 0x6e, 0x65, + 0x78, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x63, 0x0a, 0x14, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, + 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, + 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x44, 0x69, + 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x69, 0x73, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x43, 0x61, + 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x13, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, + 0x5b, 0x0a, 0x14, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x62, 0x72, + 0x65, 0x61, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, + 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x61, 0x69, 0x6c, + 0x75, 0x72, 0x65, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x69, 0x73, 0x42, 0x72, 0x65, 0x61, + 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x6f, 0x77, 0x52, 0x12, 0x6f, 0x76, 0x65, 0x72, 0x4c, 0x69, + 0x6d, 0x69, 0x74, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x22, 0x97, 0x01, 0x0a, + 0x16, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x69, + 0x73, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x49, 0x64, 0x12, 0x48, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x64, 0x65, 0x70, 0x6f, + 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x44, + 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x69, 0x73, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 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, 0x22, 0xb9, 0x05, 0x0a, 0x17, 0x46, 0x61, 0x69, 0x6c, 0x75, + 0x72, 0x65, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x69, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x78, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, + 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x10, 0x0a, + 0x03, 0x72, 0x65, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x72, 0x65, 0x66, 0x12, + 0x10, 0x0a, 0x03, 0x73, 0x68, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x68, + 0x61, 0x12, 0x19, 0x0a, 0x08, 0x68, 0x65, 0x61, 0x64, 0x5f, 0x73, 0x68, 0x61, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x53, 0x68, 0x61, 0x12, 0x18, 0x0a, 0x07, + 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, + 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x75, 0x6e, 0x5f, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x74, 0x68, + 0x12, 0x27, 0x0a, 0x0f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, + 0x5f, 0x69, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, + 0x12, 0x17, 0x0a, 0x07, 0x6a, 0x6f, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x6a, 0x6f, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x6a, 0x6f, 0x62, + 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0e, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6a, 0x6f, 0x62, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x6a, 0x6f, 0x62, 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x6c, 0x75, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6a, 0x6f, 0x62, 0x43, + 0x6f, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x74, 0x74, + 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, + 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x74, 0x74, 0x65, + 0x6d, 0x70, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x61, 0x74, 0x74, 0x65, 0x6d, + 0x70, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x74, 0x74, 0x65, + 0x6d, 0x70, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x61, 0x74, 0x74, + 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x43, 0x6f, + 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x18, 0x74, 0x72, 0x75, 0x6e, + 0x63, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x73, 0x18, 0x15, 0x20, 0x03, 0x28, 0x09, 0x52, 0x16, 0x74, 0x72, 0x75, 0x6e, + 0x63, 0x61, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x73, 0x22, 0xcf, 0x03, 0x0a, 0x0c, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, + 0x70, 0x72, 0x69, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, + 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, + 0x12, 0x41, 0x0a, 0x1d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x5f, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x1a, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x4c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x69, 0x73, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x69, + 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x66, 0x69, + 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, + 0x65, 0x46, 0x69, 0x78, 0x12, 0x4c, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, + 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, + 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x72, + 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, + 0x74, 0x52, 0x0f, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x76, + 0x65, 0x73, 0x12, 0x40, 0x0a, 0x1c, 0x6f, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x5f, 0x72, 0x65, + 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x1a, 0x6f, 0x6d, 0x69, 0x74, 0x74, 0x65, + 0x64, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xb4, 0x06, 0x0a, 0x15, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, + 0x6e, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x12, 0x15, + 0x0a, 0x06, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x72, 0x75, 0x6e, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x74, 0x68, + 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x6a, 0x6f, 0x62, 0x5f, 0x6b, + 0x65, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6a, 0x6f, 0x62, 0x4b, 0x65, 0x79, + 0x12, 0x28, 0x0a, 0x10, 0x6a, 0x6f, 0x62, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6a, 0x6f, 0x62, 0x44, + 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6a, 0x6f, + 0x62, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x6a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x6a, 0x6f, 0x62, + 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x6a, 0x6f, 0x62, 0x43, 0x6f, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x49, 0x64, 0x12, + 0x18, 0x0a, 0x07, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x07, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x74, 0x74, + 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x2d, 0x0a, 0x12, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x63, + 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x61, 0x74, + 0x74, 0x65, 0x6d, 0x70, 0x74, 0x43, 0x6f, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, + 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x41, 0x0a, 0x1d, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x6f, 0x72, + 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x10, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x1a, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, + 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x69, 0x73, 0x18, 0x11, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x69, 0x73, 0x12, 0x21, 0x0a, + 0x0c, 0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x66, 0x69, 0x78, 0x18, 0x12, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x46, 0x69, 0x78, + 0x12, 0x45, 0x0a, 0x0e, 0x72, 0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x74, 0x5f, 0x6c, 0x69, 0x6e, + 0x65, 0x73, 0x18, 0x13, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, + 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x74, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x4c, 0x69, 0x6e, 0x65, 0x52, 0x0d, 0x72, 0x65, 0x6c, 0x65, 0x76, 0x61, + 0x6e, 0x74, 0x4c, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x42, 0x0a, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x5f, + 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x14, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x72, 0x69, + 0x6c, 0x6c, 0x44, 0x6f, 0x77, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0c, 0x6e, + 0x65, 0x78, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x11, + 0x52, 0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x4c, 0x69, 0x6e, + 0x65, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x65, 0x70, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x69, + 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0a, 0x6c, 0x69, 0x6e, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x5f, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, + 0x65, 0x64, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x6f, 0x72, + 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x15, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4f, 0x72, 0x69, 0x67, + 0x69, 0x6e, 0x61, 0x6c, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0xaa, 0x09, 0x0a, 0x16, 0x46, + 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x69, 0x73, 0x42, + 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x12, 0x43, 0x0a, 0x1e, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, + 0x70, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x5f, 0x63, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x1b, 0x66, + 0x61, 0x69, 0x6c, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x43, 0x61, 0x6e, 0x64, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3f, 0x0a, 0x1c, 0x66, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x5f, 0x63, 0x61, 0x6e, + 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x61, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x19, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x43, + 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x43, 0x61, 0x70, 0x12, 0x35, 0x0a, 0x17, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x5f, 0x6a, 0x6f, 0x62, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x14, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x4a, 0x6f, 0x62, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x12, 0x36, 0x0a, 0x17, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x64, 0x65, + 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x44, 0x65, 0x70, 0x65, + 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x39, 0x0a, 0x19, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x16, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3d, 0x0a, 0x1b, 0x6f, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, + 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x18, 0x6f, 0x6d, 0x69, 0x74, + 0x74, 0x65, 0x64, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x11, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4c, + 0x69, 0x6d, 0x69, 0x74, 0x12, 0x45, 0x0a, 0x1f, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, + 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x1c, 0x72, + 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x73, 0x50, 0x65, + 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x72, + 0x65, 0x63, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x72, 0x65, 0x63, 0x65, 0x6e, + 0x74, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x2e, 0x0a, + 0x13, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x32, 0x0a, + 0x15, 0x6f, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x6f, 0x6d, + 0x69, 0x74, 0x74, 0x65, 0x64, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x74, 0x5f, 0x6c, 0x69, + 0x6e, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, + 0x72, 0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x74, 0x4c, 0x69, 0x6e, 0x65, 0x4c, 0x69, 0x6d, 0x69, + 0x74, 0x12, 0x3a, 0x0a, 0x1a, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x5f, + 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, + 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x16, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4c, 0x69, 0x6e, 0x65, + 0x42, 0x6f, 0x64, 0x79, 0x43, 0x68, 0x61, 0x72, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x37, 0x0a, + 0x18, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x63, + 0x68, 0x61, 0x72, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x15, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x43, 0x68, 0x61, + 0x72, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x37, 0x0a, 0x18, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, + 0x74, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x5f, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, + 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x43, 0x68, 0x61, 0x72, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, + 0x4c, 0x0a, 0x23, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x77, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x64, 0x6f, 0x77, 0x6e, + 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x1f, 0x6f, 0x76, + 0x65, 0x72, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x42, + 0x72, 0x65, 0x61, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x42, 0x0a, + 0x1e, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x6a, 0x6f, 0x62, 0x5f, + 0x62, 0x72, 0x65, 0x61, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, + 0x11, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x1a, 0x6f, 0x76, 0x65, 0x72, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x4a, 0x6f, 0x62, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x4c, 0x69, 0x6d, 0x69, + 0x74, 0x12, 0x47, 0x0a, 0x20, 0x6f, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x5f, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x1d, 0x6f, 0x6d, 0x69, + 0x74, 0x74, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x42, 0x72, 0x65, 0x61, + 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3d, 0x0a, 0x1b, 0x6f, 0x6d, + 0x69, 0x74, 0x74, 0x65, 0x64, 0x5f, 0x6a, 0x6f, 0x62, 0x5f, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x64, + 0x6f, 0x77, 0x6e, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x18, 0x6f, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x42, 0x72, 0x65, 0x61, 0x6b, + 0x64, 0x6f, 0x77, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x72, 0x75, + 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x74, 0x72, + 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x22, 0xdd, 0x01, 0x0a, 0x10, 0x44, 0x72, 0x69, 0x6c, + 0x6c, 0x44, 0x6f, 0x77, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x35, 0x0a, 0x04, + 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x64, 0x65, 0x70, + 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x6c, 0x6c, 0x44, 0x6f, + 0x77, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, + 0x69, 0x6e, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x75, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x75, + 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, + 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x76, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, + 0x61, 0x72, 0x67, 0x76, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, + 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x61, 0x0a, 0x23, 0x46, 0x61, 0x69, 0x6c, 0x75, + 0x72, 0x65, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x69, 0x73, 0x43, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x3a, + 0x0a, 0x19, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x17, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x22, 0xbc, 0x02, 0x0a, 0x1c, 0x46, + 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x69, 0x73, 0x42, + 0x72, 0x65, 0x61, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x6f, 0x77, 0x12, 0x48, 0x0a, 0x0b, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x27, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x46, + 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x69, 0x73, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x43, 0x0a, 0x1e, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x62, 0x6c, + 0x65, 0x6d, 0x5f, 0x63, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x1b, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, + 0x50, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x42, 0x0a, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x64, + 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x6c, 0x6c, + 0x44, 0x6f, 0x77, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0c, 0x6e, 0x65, 0x78, + 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x3c, 0x0a, 0x1b, 0x47, 0x65, 0x74, + 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x65, + 0x6d, 0x70, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x74, + 0x74, 0x65, 0x6d, 0x70, 0x74, 0x49, 0x64, 0x22, 0x2d, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4a, 0x6f, + 0x62, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x22, 0x2d, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, + 0x0a, 0x06, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x72, 0x75, 0x6e, 0x49, 0x64, 0x22, 0xaa, 0x02, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, + 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x03, 0x72, 0x75, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x75, 0x6e, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x03, 0x72, 0x75, 0x6e, 0x12, 0x41, 0x0a, 0x08, 0x77, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x64, + 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x32, 0x0a, + 0x03, 0x6a, 0x6f, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x64, 0x65, 0x70, + 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x4a, 0x6f, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x03, 0x6a, 0x6f, + 0x62, 0x12, 0x3e, 0x0a, 0x07, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, + 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x07, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, + 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x61, 0x74, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x41, 0x74, 0x22, 0xa5, 0x02, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x03, + 0x72, 0x75, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, + 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x03, 0x72, 0x75, 0x6e, + 0x12, 0x41, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x12, 0x34, 0x0a, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x4a, 0x6f, 0x62, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x52, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x22, 0x8b, 0x01, 0x0a, 0x13, 0x43, 0x49, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x4a, 0x6f, 0x62, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x12, 0x32, 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, - 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x4a, 0x6f, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, - 0x52, 0x03, 0x6a, 0x6f, 0x62, 0x12, 0x40, 0x0a, 0x08, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, - 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x41, - 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x08, 0x61, - 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x22, 0xc0, 0x02, 0x0a, 0x17, 0x43, 0x49, 0x4d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x12, 0x3e, 0x0a, 0x07, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x41, 0x74, 0x74, 0x65, - 0x6d, 0x70, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x61, 0x74, 0x74, 0x65, - 0x6d, 0x70, 0x74, 0x12, 0x46, 0x0a, 0x0c, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, - 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x64, 0x65, 0x70, 0x6f, + 0x6c, 0x6f, 0x77, 0x12, 0x32, 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x4a, 0x6f, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x78, 0x74, 0x52, 0x03, 0x6a, 0x6f, 0x62, 0x12, 0x40, 0x0a, 0x08, 0x61, 0x74, 0x74, 0x65, 0x6d, + 0x70, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x0c, 0x61, - 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x31, 0x0a, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x64, 0x65, 0x70, - 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x12, 0x33, - 0x0a, 0x03, 0x63, 0x61, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x64, 0x65, + 0x73, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, + 0x08, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x41, 0x74, 0x22, 0xb1, 0x01, 0x0a, 0x15, 0x47, + 0x65, 0x74, 0x52, 0x75, 0x6e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x03, 0x72, 0x75, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x52, 0x03, 0x72, 0x75, 0x6e, 0x12, 0x43, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x43, 0x61, 0x70, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x03, - 0x63, 0x61, 0x70, 0x12, 0x35, 0x0a, 0x07, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x18, 0x05, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x53, 0x61, 0x6d, 0x70, 0x6c, - 0x65, 0x52, 0x07, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x22, 0x89, 0x02, 0x0a, 0x17, 0x43, - 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x53, - 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x3e, 0x0a, 0x07, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, - 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x41, - 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x61, - 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x12, 0x46, 0x0a, 0x0c, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, - 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x64, - 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, - 0x52, 0x0c, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x31, - 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x69, 0x63, 0x73, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x1f, 0x0a, + 0x0b, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x41, 0x74, 0x22, 0x93, + 0x01, 0x0a, 0x18, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x41, 0x0a, 0x08, 0x77, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x73, 0x12, 0x33, 0x0a, 0x03, 0x63, 0x61, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, - 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x43, 0x61, 0x70, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x52, 0x03, 0x63, 0x61, 0x70, 0x22, 0x90, 0x02, 0x0a, 0x13, 0x43, 0x49, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x15, - 0x0a, 0x06, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x72, 0x75, 0x6e, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x72, 0x65, 0x66, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x72, 0x65, 0x66, 0x12, 0x10, 0x0a, 0x03, 0x73, - 0x68, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x68, 0x61, 0x12, 0x19, 0x0a, - 0x08, 0x68, 0x65, 0x61, 0x64, 0x5f, 0x73, 0x68, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x68, 0x65, 0x61, 0x64, 0x53, 0x68, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, - 0x67, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, - 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x69, 0x6e, 0x69, - 0x73, 0x68, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, - 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x41, 0x74, 0x22, 0xeb, 0x01, 0x0a, 0x18, 0x43, 0x49, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, - 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x69, 0x6e, - 0x69, 0x73, 0x68, 0x65, 0x64, 0x41, 0x74, 0x22, 0x85, 0x02, 0x0a, 0x13, 0x43, 0x49, 0x4d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x4a, 0x6f, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, - 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x6a, 0x6f, 0x62, 0x5f, 0x6b, 0x65, - 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6a, 0x6f, 0x62, 0x4b, 0x65, 0x79, 0x12, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x78, 0x74, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x34, + 0x0a, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x64, + 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x4a, 0x6f, 0x62, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x04, + 0x6a, 0x6f, 0x62, 0x73, 0x22, 0x8b, 0x01, 0x0a, 0x13, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x4a, 0x6f, 0x62, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x32, 0x0a, 0x03, + 0x6a, 0x6f, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, + 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x4a, 0x6f, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x03, 0x6a, 0x6f, 0x62, + 0x12, 0x40, 0x0a, 0x08, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, + 0x74, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x08, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, + 0x74, 0x73, 0x22, 0xc0, 0x02, 0x0a, 0x17, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x3e, + 0x0a, 0x07, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x24, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x12, 0x46, + 0x0a, 0x0c, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x41, 0x76, 0x61, 0x69, + 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x0c, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x31, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x12, 0x33, 0x0a, 0x03, 0x63, 0x61, 0x70, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x43, 0x61, + 0x70, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x03, 0x63, 0x61, 0x70, 0x12, 0x35, + 0x0a, 0x07, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1b, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x52, 0x07, 0x73, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x22, 0x89, 0x02, 0x0a, 0x17, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, + 0x79, 0x12, 0x3e, 0x0a, 0x07, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, + 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, + 0x74, 0x12, 0x46, 0x0a, 0x0c, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, + 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x41, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x0c, 0x61, 0x76, 0x61, + 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x31, 0x0a, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, + 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x12, 0x33, 0x0a, 0x03, + 0x63, 0x61, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x64, 0x65, 0x70, 0x6f, + 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x43, 0x61, 0x70, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x03, 0x63, 0x61, + 0x70, 0x22, 0x90, 0x02, 0x0a, 0x13, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, + 0x75, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x72, 0x75, 0x6e, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x49, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x72, 0x65, 0x70, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x72, 0x65, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x72, 0x65, 0x66, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x68, 0x61, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x68, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x68, 0x65, 0x61, 0x64, + 0x5f, 0x73, 0x68, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, + 0x53, 0x68, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x5f, 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, + 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, + 0x64, 0x41, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x5f, + 0x61, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, + 0x65, 0x64, 0x41, 0x74, 0x22, 0xeb, 0x01, 0x0a, 0x18, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, + 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x70, + 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, + 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x61, 0x74, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, + 0x41, 0x74, 0x22, 0x85, 0x02, 0x0a, 0x13, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x4a, 0x6f, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, + 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, + 0x64, 0x12, 0x17, 0x0a, 0x07, 0x6a, 0x6f, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x6a, 0x6f, 0x62, 0x4b, 0x65, 0x79, 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, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x74, + 0x74, 0x65, 0x6d, 0x70, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x69, 0x6e, + 0x69, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x41, 0x74, 0x22, 0xa7, 0x02, 0x0a, 0x17, 0x43, + 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x74, 0x74, 0x65, + 0x6d, 0x70, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 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, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6e, - 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x5f, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, - 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, - 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1f, - 0x0a, 0x0b, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x41, 0x74, 0x22, - 0xa7, 0x02, 0x0a, 0x17, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x41, 0x74, 0x74, - 0x65, 0x6d, 0x70, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, - 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x74, - 0x74, 0x65, 0x6d, 0x70, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x61, 0x74, 0x74, - 0x65, 0x6d, 0x70, 0x74, 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, 0x1e, 0x0a, 0x0a, - 0x63, 0x6f, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, - 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x69, 0x6e, 0x69, - 0x73, 0x68, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, - 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x41, 0x74, 0x22, 0x85, 0x02, 0x0a, 0x0e, 0x43, 0x49, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2c, 0x0a, 0x0f, 0x63, 0x70, - 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x0e, 0x63, 0x70, 0x75, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, 0x12, 0x6d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x01, 0x48, 0x01, 0x52, 0x11, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x74, - 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, - 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x79, 0x74, - 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x48, 0x02, 0x52, 0x10, 0x6d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x88, 0x01, 0x01, 0x42, - 0x12, 0x0a, 0x10, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, - 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, - 0x73, 0x22, 0x8c, 0x06, 0x0a, 0x0e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x53, - 0x74, 0x61, 0x74, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x73, 0x61, 0x6d, 0x70, - 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x63, 0x70, 0x75, 0x5f, 0x73, - 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0e, 0x63, 0x70, 0x75, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x73, 0x61, 0x6d, 0x70, - 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, - 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x35, 0x0a, 0x14, 0x70, 0x65, 0x61, 0x6b, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x74, - 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x48, - 0x00, 0x52, 0x12, 0x70, 0x65, 0x61, 0x6b, 0x43, 0x70, 0x75, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x61, 0x76, 0x65, 0x72, - 0x61, 0x67, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x48, 0x01, 0x52, 0x15, 0x61, 0x76, 0x65, - 0x72, 0x61, 0x67, 0x65, 0x43, 0x70, 0x75, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x70, 0x65, 0x61, 0x6b, 0x5f, 0x6d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x48, 0x02, 0x52, 0x15, 0x70, 0x65, 0x61, 0x6b, 0x4d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, - 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x6d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x48, 0x03, 0x52, 0x18, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, - 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, 0x13, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x64, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x11, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x64, 0x5f, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x12, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x46, 0x69, 0x6e, - 0x69, 0x73, 0x68, 0x65, 0x64, 0x41, 0x74, 0x12, 0x3a, 0x0a, 0x17, 0x70, 0x65, 0x61, 0x6b, 0x5f, - 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x79, 0x74, - 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x48, 0x04, 0x52, 0x14, 0x70, 0x65, 0x61, 0x6b, - 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, - 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x1a, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, - 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x01, 0x48, 0x05, 0x52, 0x17, 0x61, 0x76, 0x65, 0x72, 0x61, - 0x67, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x42, 0x79, 0x74, - 0x65, 0x73, 0x88, 0x01, 0x01, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x70, 0x65, 0x61, 0x6b, 0x5f, 0x63, - 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x1a, - 0x0a, 0x18, 0x5f, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x75, - 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x70, - 0x65, 0x61, 0x6b, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x61, 0x76, 0x65, 0x72, 0x61, - 0x67, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, + 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x61, 0x6e, 0x64, 0x62, + 0x6f, 0x78, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x61, 0x6e, + 0x64, 0x62, 0x6f, 0x78, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, + 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, + 0x64, 0x41, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x5f, + 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, + 0x65, 0x64, 0x41, 0x74, 0x22, 0x85, 0x02, 0x0a, 0x0e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2c, 0x0a, 0x0f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, + 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, + 0x52, 0x0e, 0x63, 0x70, 0x75, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, 0x12, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, + 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x48, + 0x01, 0x52, 0x11, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x6d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x04, 0x48, 0x02, 0x52, 0x10, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, + 0x67, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x88, 0x01, 0x01, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x63, + 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x15, + 0x0a, 0x13, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x22, 0x8c, 0x06, 0x0a, + 0x0e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, + 0x21, 0x0a, 0x0c, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x63, 0x70, 0x75, 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x63, 0x70, + 0x75, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x13, + 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x6d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x35, 0x0a, 0x14, + 0x70, 0x65, 0x61, 0x6b, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x12, 0x70, 0x65, + 0x61, 0x6b, 0x43, 0x70, 0x75, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, + 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x01, 0x48, 0x01, 0x52, 0x15, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x43, + 0x70, 0x75, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, + 0x12, 0x3b, 0x0a, 0x17, 0x70, 0x65, 0x61, 0x6b, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, + 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x01, 0x48, 0x02, 0x52, 0x15, 0x70, 0x65, 0x61, 0x6b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, + 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, + 0x1a, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, + 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x01, 0x48, 0x03, 0x52, 0x18, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, + 0x12, 0x2e, 0x0a, 0x13, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x6f, + 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, + 0x12, 0x30, 0x0a, 0x14, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x66, 0x69, 0x6e, + 0x69, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, + 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, + 0x41, 0x74, 0x12, 0x3a, 0x0a, 0x17, 0x70, 0x65, 0x61, 0x6b, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x04, 0x48, 0x04, 0x52, 0x14, 0x70, 0x65, 0x61, 0x6b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x40, + 0x0a, 0x1a, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x01, 0x48, 0x05, 0x52, 0x17, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x88, 0x01, 0x01, + 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x70, 0x65, 0x61, 0x6b, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x74, + 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x61, 0x76, + 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x70, 0x65, 0x61, 0x6b, 0x5f, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, - 0x73, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x6d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, - 0x22, 0x6b, 0x0a, 0x15, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x41, 0x76, 0x61, - 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x3a, 0x0a, 0x04, 0x63, 0x6f, 0x64, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, - 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x41, - 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x52, - 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x82, 0x02, - 0x0a, 0x14, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x43, 0x61, 0x70, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x28, 0x0a, 0x10, 0x72, 0x61, 0x77, 0x5f, 0x73, 0x61, - 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x0e, 0x72, 0x61, 0x77, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x32, 0x0a, 0x15, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x5f, 0x73, 0x61, 0x6d, - 0x70, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x13, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x39, 0x0a, 0x19, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x65, 0x64, 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x16, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x74, 0x75, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x70, 0x65, 0x61, 0x6b, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x42, 0x1d, 0x0a, 0x1b, + 0x5f, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, + 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x22, 0x6b, 0x0a, 0x15, 0x43, + 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x79, 0x12, 0x3a, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x82, 0x02, 0x0a, 0x14, 0x43, 0x49, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x43, 0x61, 0x70, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x12, 0x28, 0x0a, 0x10, 0x72, 0x61, 0x77, 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x72, 0x61, 0x77, + 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x32, 0x0a, 0x15, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x20, 0x0a, 0x0b, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x64, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, - 0x64, 0x12, 0x2f, 0x0a, 0x13, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, - 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, - 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, - 0x67, 0x79, 0x22, 0x4c, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x75, 0x6d, 0x6d, - 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, - 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, - 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x49, 0x64, - 0x22, 0xfb, 0x02, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x75, 0x6d, 0x6d, 0x61, - 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x72, - 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x72, 0x67, 0x49, - 0x64, 0x12, 0x15, 0x0a, 0x06, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x77, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, - 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, - 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x49, 0x64, 0x12, - 0x18, 0x0a, 0x07, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x07, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, - 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6a, - 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x74, 0x74, 0x65, - 0x6d, 0x70, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x1f, 0x0a, 0x0b, 0x68, 0x61, 0x73, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x68, 0x61, 0x73, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, - 0x12, 0x21, 0x0a, 0x0c, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x52, 0x65, 0x61, - 0x73, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x73, 0x74, 0x65, 0x70, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x22, 0x58, - 0x0a, 0x18, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, - 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x74, - 0x74, 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, - 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, - 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x6f, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x4a, - 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x69, 0x6e, 0x65, 0x52, 0x05, 0x6c, 0x69, 0x6e, 0x65, - 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, - 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x6b, 0x0a, 0x1b, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x65, - 0x6d, 0x70, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x74, - 0x74, 0x65, 0x6d, 0x70, 0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, - 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, - 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x22, 0x90, 0x01, 0x0a, 0x1c, 0x53, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x69, 0x6e, 0x65, 0x52, 0x04, 0x6c, 0x69, 0x6e, - 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6e, 0x65, 0x78, 0x74, 0x43, 0x75, 0x72, 0x73, - 0x6f, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x74, 0x74, 0x65, - 0x6d, 0x70, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x93, 0x01, 0x0a, 0x1b, 0x45, 0x78, + 0x39, 0x0a, 0x19, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x5f, + 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x16, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x53, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x6f, + 0x77, 0x6e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0b, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x64, 0x12, 0x2f, 0x0a, 0x13, + 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, + 0x65, 0x67, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x64, 0x6f, 0x77, 0x6e, 0x73, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x22, 0x4c, 0x0a, + 0x14, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, + 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x49, 0x64, 0x22, 0xfb, 0x02, 0x0a, 0x15, + 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x72, 0x67, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, + 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x72, 0x75, + 0x6e, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, + 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x61, + 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x74, + 0x74, 0x65, 0x6d, 0x70, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x61, 0x74, 0x74, + 0x65, 0x6d, 0x70, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6a, 0x6f, 0x62, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x74, 0x74, + 0x65, 0x6d, 0x70, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x68, 0x61, + 0x73, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0a, 0x68, 0x61, 0x73, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x65, + 0x6d, 0x70, 0x74, 0x79, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x1d, + 0x0a, 0x0a, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x09, 0x73, 0x74, 0x65, 0x70, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1a, 0x0a, + 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x22, 0x58, 0x0a, 0x18, 0x47, 0x65, 0x74, + 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x74, 0x74, 0x65, 0x6d, + 0x70, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x22, 0x6f, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, + 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x2a, 0x0a, 0x05, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x14, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, + 0x67, 0x4c, 0x69, 0x6e, 0x65, 0x52, 0x05, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, + 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x6b, 0x0a, 0x1b, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4a, 0x6f, + 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, + 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, + 0x62, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, + 0x64, 0x22, 0x90, 0x01, 0x0a, 0x1c, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4a, 0x6f, 0x62, 0x41, + 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x14, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, + 0x6f, 0x67, 0x4c, 0x69, 0x6e, 0x65, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x1f, 0x0a, 0x0b, + 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x6e, 0x65, 0x78, 0x74, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x25, 0x0a, + 0x0e, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x22, 0x93, 0x01, 0x0a, 0x1b, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4a, + 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, + 0x74, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x06, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x64, 0x65, 0x70, + 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, + 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x9c, 0x01, 0x0a, 0x1b, 0x4a, + 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, + 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, + 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x64, 0x65, 0x70, 0x6f, + 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, + 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x87, 0x01, 0x0a, 0x1c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, - 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x74, 0x74, - 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, - 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, - 0x3e, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x26, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x6f, - 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, - 0x9c, 0x01, 0x0a, 0x1b, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, - 0x67, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, - 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x63, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x3e, - 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, - 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x6f, 0x62, - 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x87, - 0x01, 0x0a, 0x1c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, - 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x46, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x28, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x45, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x08, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x42, - 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0xca, 0x01, 0x0a, 0x07, 0x4c, 0x6f, 0x67, - 0x4c, 0x69, 0x6e, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x74, 0x65, 0x70, 0x4b, 0x65, 0x79, 0x12, - 0x21, 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x6d, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x4d, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6c, 0x69, 0x6e, 0x65, 0x4e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x62, - 0x6f, 0x64, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, - 0x17, 0x0a, 0x07, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x73, 0x74, 0x65, 0x70, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x65, 0x70, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x74, 0x65, - 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xb5, 0x01, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, - 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, - 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x12, 0x0a, - 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, - 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x68, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x73, 0x68, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x0e, 0x0a, - 0x02, 0x70, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x70, 0x72, 0x22, 0x70, 0x0a, - 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x34, 0x0a, 0x04, 0x72, 0x75, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x75, - 0x6e, 0x52, 0x04, 0x72, 0x75, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, - 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, - 0xd0, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x75, 0x6e, 0x12, 0x15, 0x0a, 0x06, 0x72, 0x75, 0x6e, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x49, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, - 0x70, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, - 0x73, 0x68, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x68, 0x61, 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, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x72, 0x65, 0x66, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x72, 0x65, 0x66, 0x12, 0x19, 0x0a, 0x08, 0x68, 0x65, 0x61, 0x64, 0x5f, - 0x73, 0x68, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x53, - 0x68, 0x61, 0x22, 0xc1, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, - 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, - 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x72, 0x65, 0x70, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, - 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, - 0x67, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, - 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x68, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x73, 0x68, 0x61, 0x12, 0x0e, 0x0a, 0x02, 0x70, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x70, 0x72, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x65, - 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x78, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x48, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x09, - 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, - 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x22, 0xee, 0x02, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, - 0x72, 0x65, 0x70, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, - 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, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, - 0x67, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, - 0x65, 0x72, 0x12, 0x15, 0x0a, 0x06, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x68, 0x61, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x68, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x68, - 0x65, 0x61, 0x64, 0x5f, 0x73, 0x68, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x68, - 0x65, 0x61, 0x64, 0x53, 0x68, 0x61, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x4a, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x64, 0x65, 0x70, 0x6f, - 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4a, 0x6f, 0x62, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x09, 0x6a, 0x6f, 0x62, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x73, 0x22, 0xee, 0x01, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4a, 0x6f, 0x62, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x71, 0x75, - 0x65, 0x75, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x71, 0x75, 0x65, 0x75, - 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x07, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x18, 0x0a, 0x07, - 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x72, - 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, - 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, - 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x61, - 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x63, - 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x6b, 0x69, 0x70, - 0x70, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x73, 0x6b, 0x69, 0x70, 0x70, - 0x65, 0x64, 0x2a, 0xff, 0x01, 0x0a, 0x19, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x64, 0x65, - 0x12, 0x2c, 0x0a, 0x28, 0x43, 0x49, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x41, - 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x43, 0x4f, 0x44, 0x45, - 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x2a, - 0x0a, 0x26, 0x43, 0x49, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x41, 0x56, 0x41, - 0x49, 0x4c, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x41, - 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x2b, 0x0a, 0x27, 0x43, 0x49, - 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, - 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x4e, 0x4f, 0x5f, 0x53, 0x41, - 0x4e, 0x44, 0x42, 0x4f, 0x58, 0x10, 0x02, 0x12, 0x2e, 0x0a, 0x2a, 0x43, 0x49, 0x5f, 0x4d, 0x45, - 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x49, 0x4c, 0x49, - 0x54, 0x59, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x4e, 0x4f, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, - 0x52, 0x41, 0x4e, 0x47, 0x45, 0x10, 0x03, 0x12, 0x2b, 0x0a, 0x27, 0x43, 0x49, 0x5f, 0x4d, 0x45, + 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x08, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x64, + 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x41, 0x74, + 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x12, 0x16, 0x0a, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0c, 0x48, 0x00, 0x52, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x22, 0xca, 0x01, 0x0a, 0x07, 0x4c, 0x6f, 0x67, 0x4c, 0x69, 0x6e, 0x65, 0x12, + 0x19, 0x0a, 0x08, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x73, 0x74, 0x65, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4d, 0x73, 0x12, 0x1f, 0x0a, + 0x0b, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0a, 0x6c, 0x69, 0x6e, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x16, + 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, + 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x74, + 0x65, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x65, + 0x70, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x74, 0x65, 0x70, 0x4e, 0x61, 0x6d, 0x65, + 0x22, 0xb5, 0x01, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x09, + 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, + 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, + 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x10, 0x0a, 0x03, + 0x73, 0x68, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x68, 0x61, 0x12, 0x18, + 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x70, 0x72, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x70, 0x72, 0x22, 0x70, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x04, + 0x72, 0x75, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x64, 0x65, 0x70, + 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x75, 0x6e, 0x52, 0x04, 0x72, 0x75, + 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, + 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xd0, 0x01, 0x0a, 0x13, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, + 0x75, 0x6e, 0x12, 0x15, 0x0a, 0x06, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, + 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x18, 0x0a, + 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x68, 0x61, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x68, 0x61, 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, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, + 0x12, 0x10, 0x0a, 0x03, 0x72, 0x65, 0x66, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x72, + 0x65, 0x66, 0x12, 0x19, 0x0a, 0x08, 0x68, 0x65, 0x61, 0x64, 0x5f, 0x73, 0x68, 0x61, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x53, 0x68, 0x61, 0x22, 0xc1, 0x01, + 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, + 0x69, 0x7a, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x10, 0x0a, + 0x03, 0x73, 0x68, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x68, 0x61, 0x12, + 0x0e, 0x0a, 0x02, 0x70, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x70, 0x72, 0x4a, + 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x22, 0x78, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x09, 0x77, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, + 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x73, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, 0x0f, 0x6e, 0x65, 0x78, 0x74, + 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xee, 0x02, 0x0a, 0x1d, + 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x1f, 0x0a, + 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x49, 0x64, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x70, + 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 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, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x15, 0x0a, + 0x06, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x72, + 0x75, 0x6e, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x68, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x73, 0x68, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x68, 0x65, 0x61, 0x64, 0x5f, 0x73, + 0x68, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x53, 0x68, + 0x61, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, + 0x12, 0x4a, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4a, 0x6f, 0x62, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x73, 0x52, 0x09, 0x6a, 0x6f, 0x62, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x22, 0xee, 0x01, 0x0a, + 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4a, 0x6f, 0x62, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, + 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x12, 0x18, 0x0a, + 0x07, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, + 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x69, + 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, + 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x08, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x12, 0x16, 0x0a, + 0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x66, + 0x61, 0x69, 0x6c, 0x65, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, + 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, + 0x6c, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x2a, 0xf0, 0x01, + 0x0a, 0x1a, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, + 0x69, 0x73, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2d, 0x0a, 0x29, + 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x5f, 0x44, 0x49, 0x41, 0x47, 0x4e, 0x4f, 0x53, 0x49, + 0x53, 0x5f, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, + 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x25, 0x0a, 0x21, 0x46, + 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x5f, 0x44, 0x49, 0x41, 0x47, 0x4e, 0x4f, 0x53, 0x49, 0x53, + 0x5f, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x55, 0x4e, + 0x10, 0x01, 0x12, 0x2a, 0x0a, 0x26, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x5f, 0x44, 0x49, + 0x41, 0x47, 0x4e, 0x4f, 0x53, 0x49, 0x53, 0x5f, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x57, 0x4f, 0x52, 0x4b, 0x46, 0x4c, 0x4f, 0x57, 0x10, 0x02, 0x12, 0x25, + 0x0a, 0x21, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x5f, 0x44, 0x49, 0x41, 0x47, 0x4e, 0x4f, + 0x53, 0x49, 0x53, 0x5f, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x4a, 0x4f, 0x42, 0x10, 0x03, 0x12, 0x29, 0x0a, 0x25, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, + 0x5f, 0x44, 0x49, 0x41, 0x47, 0x4e, 0x4f, 0x53, 0x49, 0x53, 0x5f, 0x54, 0x41, 0x52, 0x47, 0x45, + 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x4d, 0x50, 0x54, 0x10, 0x04, + 0x2a, 0xe6, 0x01, 0x0a, 0x15, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x44, 0x69, 0x61, 0x67, + 0x6e, 0x6f, 0x73, 0x69, 0x73, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x27, 0x0a, 0x23, 0x46, 0x41, + 0x49, 0x4c, 0x55, 0x52, 0x45, 0x5f, 0x44, 0x49, 0x41, 0x47, 0x4e, 0x4f, 0x53, 0x49, 0x53, 0x5f, + 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x5f, 0x44, + 0x49, 0x41, 0x47, 0x4e, 0x4f, 0x53, 0x49, 0x53, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x45, + 0x4d, 0x50, 0x54, 0x59, 0x10, 0x01, 0x12, 0x2c, 0x0a, 0x28, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, + 0x45, 0x5f, 0x44, 0x49, 0x41, 0x47, 0x4e, 0x4f, 0x53, 0x49, 0x53, 0x5f, 0x53, 0x54, 0x41, 0x54, + 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x45, 0x44, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, + 0x45, 0x53, 0x10, 0x02, 0x12, 0x2b, 0x0a, 0x27, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x5f, + 0x44, 0x49, 0x41, 0x47, 0x4e, 0x4f, 0x53, 0x49, 0x53, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, + 0x46, 0x4f, 0x43, 0x55, 0x53, 0x45, 0x44, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, + 0x03, 0x12, 0x26, 0x0a, 0x22, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x5f, 0x44, 0x49, 0x41, + 0x47, 0x4e, 0x4f, 0x53, 0x49, 0x53, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x4f, 0x56, 0x45, + 0x52, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x10, 0x04, 0x2a, 0xdf, 0x01, 0x0a, 0x14, 0x44, 0x72, + 0x69, 0x6c, 0x6c, 0x44, 0x6f, 0x77, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x4b, 0x69, + 0x6e, 0x64, 0x12, 0x27, 0x0a, 0x23, 0x44, 0x52, 0x49, 0x4c, 0x4c, 0x5f, 0x44, 0x4f, 0x57, 0x4e, + 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x41, 0x4e, 0x44, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x55, 0x4e, + 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x20, 0x0a, 0x1c, 0x44, + 0x52, 0x49, 0x4c, 0x4c, 0x5f, 0x44, 0x4f, 0x57, 0x4e, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x41, 0x4e, + 0x44, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4c, 0x4f, 0x47, 0x53, 0x10, 0x01, 0x12, 0x23, 0x0a, + 0x1f, 0x44, 0x52, 0x49, 0x4c, 0x4c, 0x5f, 0x44, 0x4f, 0x57, 0x4e, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, + 0x41, 0x4e, 0x44, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x53, 0x55, 0x4d, 0x4d, 0x41, 0x52, 0x59, + 0x10, 0x02, 0x12, 0x2d, 0x0a, 0x29, 0x44, 0x52, 0x49, 0x4c, 0x4c, 0x5f, 0x44, 0x4f, 0x57, 0x4e, + 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x41, 0x4e, 0x44, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x44, 0x49, + 0x41, 0x47, 0x4e, 0x4f, 0x53, 0x45, 0x5f, 0x57, 0x4f, 0x52, 0x4b, 0x46, 0x4c, 0x4f, 0x57, 0x10, + 0x03, 0x12, 0x28, 0x0a, 0x24, 0x44, 0x52, 0x49, 0x4c, 0x4c, 0x5f, 0x44, 0x4f, 0x57, 0x4e, 0x5f, + 0x43, 0x4f, 0x4d, 0x4d, 0x41, 0x4e, 0x44, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x44, 0x49, 0x41, + 0x47, 0x4e, 0x4f, 0x53, 0x45, 0x5f, 0x4a, 0x4f, 0x42, 0x10, 0x04, 0x2a, 0xff, 0x01, 0x0a, 0x19, + 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, + 0x69, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x2c, 0x0a, 0x28, 0x43, 0x49, 0x5f, + 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x49, + 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, + 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x2a, 0x0a, 0x26, 0x43, 0x49, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x49, 0x4c, 0x49, - 0x54, 0x59, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x4e, 0x4f, 0x5f, 0x53, 0x41, 0x4d, 0x50, 0x4c, - 0x45, 0x53, 0x10, 0x04, 0x2a, 0x9b, 0x01, 0x0a, 0x19, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, - 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x6d, - 0x61, 0x74, 0x12, 0x2d, 0x0a, 0x29, 0x4a, 0x4f, 0x42, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x4d, 0x50, + 0x54, 0x59, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, + 0x45, 0x10, 0x01, 0x12, 0x2b, 0x0a, 0x27, 0x43, 0x49, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, + 0x53, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x43, + 0x4f, 0x44, 0x45, 0x5f, 0x4e, 0x4f, 0x5f, 0x53, 0x41, 0x4e, 0x44, 0x42, 0x4f, 0x58, 0x10, 0x02, + 0x12, 0x2e, 0x0a, 0x2a, 0x43, 0x49, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x41, + 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x43, 0x4f, 0x44, 0x45, + 0x5f, 0x4e, 0x4f, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x52, 0x41, 0x4e, 0x47, 0x45, 0x10, 0x03, + 0x12, 0x2b, 0x0a, 0x27, 0x43, 0x49, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x41, + 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x43, 0x4f, 0x44, 0x45, + 0x5f, 0x4e, 0x4f, 0x5f, 0x53, 0x41, 0x4d, 0x50, 0x4c, 0x45, 0x53, 0x10, 0x04, 0x2a, 0x9b, 0x01, + 0x0a, 0x19, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x2d, 0x0a, 0x29, 0x4a, + 0x4f, 0x42, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x4d, 0x50, 0x54, 0x5f, 0x4c, 0x4f, 0x47, 0x5f, 0x45, + 0x58, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x55, 0x4e, 0x53, + 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x26, 0x0a, 0x22, 0x4a, 0x4f, + 0x42, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x4d, 0x50, 0x54, 0x5f, 0x4c, 0x4f, 0x47, 0x5f, 0x45, 0x58, + 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x54, 0x45, 0x58, 0x54, + 0x10, 0x01, 0x12, 0x27, 0x0a, 0x23, 0x4a, 0x4f, 0x42, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x4d, 0x50, 0x54, 0x5f, 0x4c, 0x4f, 0x47, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x46, 0x4f, 0x52, - 0x4d, 0x41, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, - 0x00, 0x12, 0x26, 0x0a, 0x22, 0x4a, 0x4f, 0x42, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x4d, 0x50, 0x54, - 0x5f, 0x4c, 0x4f, 0x47, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, - 0x41, 0x54, 0x5f, 0x54, 0x45, 0x58, 0x54, 0x10, 0x01, 0x12, 0x27, 0x0a, 0x23, 0x4a, 0x4f, 0x42, - 0x5f, 0x41, 0x54, 0x54, 0x45, 0x4d, 0x50, 0x54, 0x5f, 0x4c, 0x4f, 0x47, 0x5f, 0x45, 0x58, 0x50, - 0x4f, 0x52, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x4c, - 0x10, 0x02, 0x32, 0x82, 0x0e, 0x0a, 0x09, 0x43, 0x49, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x12, 0x3a, 0x0a, 0x03, 0x52, 0x75, 0x6e, 0x12, 0x17, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, - 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x18, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, - 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x10, - 0x44, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x12, 0x24, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, - 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x49, 0x0a, 0x08, 0x52, 0x65, 0x74, 0x72, 0x79, 0x4a, 0x6f, 0x62, 0x12, 0x1c, 0x2e, 0x64, 0x65, - 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x4a, - 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x64, 0x65, 0x70, 0x6f, - 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x4a, 0x6f, 0x62, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a, 0x0d, 0x52, 0x65, - 0x72, 0x75, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x21, 0x2e, 0x64, 0x65, - 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x72, 0x75, 0x6e, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, - 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x72, - 0x75, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x5e, 0x0a, 0x0f, 0x52, 0x65, 0x74, 0x72, 0x79, 0x46, 0x61, 0x69, - 0x6c, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x23, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, - 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x46, 0x61, 0x69, 0x6c, 0x65, - 0x64, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x64, - 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, - 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x09, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, - 0x62, 0x12, 0x1d, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1e, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x0e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x22, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, - 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x43, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x12, 0x1a, 0x2e, 0x64, 0x65, 0x70, 0x6f, - 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x09, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x75, - 0x6e, 0x12, 0x1d, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1e, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x0b, 0x47, 0x65, 0x74, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x1f, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, - 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, - 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6d, 0x0a, - 0x14, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, - 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x29, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x4d, 0x41, 0x54, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x4c, 0x10, 0x02, 0x32, 0xe3, 0x0e, 0x0a, 0x09, + 0x43, 0x49, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x3a, 0x0a, 0x03, 0x52, 0x75, 0x6e, + 0x12, 0x17, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, + 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x64, 0x65, 0x70, 0x6f, + 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x10, 0x44, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, + 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x24, 0x2e, 0x64, 0x65, 0x70, 0x6f, + 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x25, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, + 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x49, 0x0a, 0x08, 0x52, 0x65, 0x74, 0x72, + 0x79, 0x4a, 0x6f, 0x62, 0x12, 0x1c, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a, 0x0d, 0x52, 0x65, 0x72, 0x75, 0x6e, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x21, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x72, 0x75, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, + 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x72, 0x75, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5e, 0x0a, + 0x0f, 0x52, 0x65, 0x74, 0x72, 0x79, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x73, + 0x12, 0x23, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, + 0x65, 0x74, 0x72, 0x79, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4a, + 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, + 0x09, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x12, 0x1d, 0x2e, 0x64, 0x65, 0x70, + 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a, + 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x64, 0x65, 0x70, 0x6f, + 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, + 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x0e, 0x43, + 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x22, 0x2e, + 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6e, 0x63, + 0x65, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x23, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x43, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x52, + 0x75, 0x6e, 0x12, 0x1a, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, + 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, + 0x09, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x75, 0x6e, 0x12, 0x1d, 0x2e, 0x64, 0x65, 0x70, + 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, + 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x64, 0x65, 0x70, 0x6f, + 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x75, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0c, 0x47, + 0x65, 0x74, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x2e, 0x64, 0x65, + 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, + 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, + 0x75, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x52, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x12, 0x1f, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5f, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x46, 0x61, 0x69, + 0x6c, 0x75, 0x72, 0x65, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x69, 0x73, 0x12, 0x27, 0x2e, + 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, + 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x69, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x44, 0x69, 0x61, 0x67, + 0x6e, 0x6f, 0x73, 0x69, 0x73, 0x22, 0x00, 0x12, 0x6d, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4a, 0x6f, + 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, + 0x28, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a, 0x0d, - 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x21, 0x2e, - 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, - 0x6f, 0x62, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x22, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, + 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x65, 0x70, 0x6f, + 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, + 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x21, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, - 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x4d, 0x65, 0x74, 0x72, + 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x65, 0x70, - 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x4d, + 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x58, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, - 0x79, 0x12, 0x21, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, + 0x12, 0x58, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x12, 0x21, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x64, 0x0a, 0x11, 0x47, 0x65, - 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x12, - 0x25, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, - 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x6f, 0x0a, 0x14, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, - 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, - 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4a, 0x6f, 0x62, - 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a, 0x0d, 0x47, 0x65, + 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x21, 0x2e, 0x64, 0x65, + 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, + 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, + 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x4a, 0x6f, 0x62, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x64, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, + 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x25, 0x2e, 0x64, 0x65, 0x70, 0x6f, + 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, + 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x26, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x14, 0x53, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, + 0x67, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, - 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, - 0x01, 0x12, 0x6f, 0x0a, 0x14, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, - 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x65, 0x70, 0x6f, - 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4a, 0x6f, - 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, + 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, + 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x6f, 0x0a, 0x14, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, + 0x6f, 0x67, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, - 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x30, 0x01, 0x12, 0x49, 0x0a, 0x08, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x12, 0x1c, - 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x64, - 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a, - 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x21, - 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x32, 0xe1, 0x01, 0x0a, 0x10, 0x4d, 0x69, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5e, 0x0a, 0x0f, - 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x23, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6d, 0x0a, 0x14, - 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x41, 0x6e, 0x64, - 0x56, 0x61, 0x72, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, - 0x41, 0x6e, 0x64, 0x56, 0x61, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, + 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, + 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x49, 0x0a, 0x08, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x12, 0x1c, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, + 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x21, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, + 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x65, + 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x32, 0xe1, 0x01, 0x0a, 0x10, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5e, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, + 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x2e, 0x64, 0x65, 0x70, 0x6f, + 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, + 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6d, 0x0a, 0x14, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, + 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x41, 0x6e, 0x64, 0x56, 0x61, 0x72, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x41, 0x6e, 0x64, 0x56, 0x61, 0x72, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x99, 0x01, 0x0a, 0x0f, - 0x63, 0x6f, 0x6d, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x42, - 0x07, 0x43, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x69, - 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x64, 0x65, 0x70, 0x6f, 0x74, - 0x2f, 0x63, 0x69, 0x2f, 0x76, 0x31, 0x3b, 0x63, 0x69, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x44, 0x43, - 0x58, 0xaa, 0x02, 0x0b, 0x44, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x43, 0x69, 0x2e, 0x56, 0x31, 0xca, - 0x02, 0x0b, 0x44, 0x65, 0x70, 0x6f, 0x74, 0x5c, 0x43, 0x69, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x17, - 0x44, 0x65, 0x70, 0x6f, 0x74, 0x5c, 0x43, 0x69, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0d, 0x44, 0x65, 0x70, 0x6f, 0x74, 0x3a, - 0x3a, 0x43, 0x69, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, + 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x73, 0x41, 0x6e, 0x64, 0x56, 0x61, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x99, 0x01, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x2e, 0x64, 0x65, + 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x42, 0x07, 0x43, 0x69, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x69, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2f, 0x63, 0x69, 0x2f, 0x76, 0x31, + 0x3b, 0x63, 0x69, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x44, 0x43, 0x58, 0xaa, 0x02, 0x0b, 0x44, 0x65, + 0x70, 0x6f, 0x74, 0x2e, 0x43, 0x69, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0b, 0x44, 0x65, 0x70, 0x6f, + 0x74, 0x5c, 0x43, 0x69, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x17, 0x44, 0x65, 0x70, 0x6f, 0x74, 0x5c, + 0x43, 0x69, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0xea, 0x02, 0x0d, 0x44, 0x65, 0x70, 0x6f, 0x74, 0x3a, 0x3a, 0x43, 0x69, 0x3a, 0x3a, 0x56, + 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -6370,175 +8172,208 @@ func file_depot_ci_v1_ci_proto_rawDescGZIP() []byte { return file_depot_ci_v1_ci_proto_rawDescData } -var file_depot_ci_v1_ci_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_depot_ci_v1_ci_proto_msgTypes = make([]protoimpl.MessageInfo, 71) +var file_depot_ci_v1_ci_proto_enumTypes = make([]protoimpl.EnumInfo, 5) +var file_depot_ci_v1_ci_proto_msgTypes = make([]protoimpl.MessageInfo, 82) var file_depot_ci_v1_ci_proto_goTypes = []interface{}{ - (CIMetricsAvailabilityCode)(0), // 0: depot.ci.v1.CIMetricsAvailabilityCode - (JobAttemptLogExportFormat)(0), // 1: depot.ci.v1.JobAttemptLogExportFormat - (*GetInstallationRequest)(nil), // 2: depot.ci.v1.GetInstallationRequest - (*GetInstallationResponse)(nil), // 3: depot.ci.v1.GetInstallationResponse - (*ImportSecretsAndVarsRequest)(nil), // 4: depot.ci.v1.ImportSecretsAndVarsRequest - (*ImportSecretsAndVarsResponse)(nil), // 5: depot.ci.v1.ImportSecretsAndVarsResponse - (*DryRunResult)(nil), // 6: depot.ci.v1.DryRunResult - (*RunResult)(nil), // 7: depot.ci.v1.RunResult - (*Installation)(nil), // 8: depot.ci.v1.Installation - (*RunRequest)(nil), // 9: depot.ci.v1.RunRequest - (*RunResponse)(nil), // 10: depot.ci.v1.RunResponse - (*DispatchWorkflowRequest)(nil), // 11: depot.ci.v1.DispatchWorkflowRequest - (*DispatchWorkflowResponse)(nil), // 12: depot.ci.v1.DispatchWorkflowResponse - (*RetryJobRequest)(nil), // 13: depot.ci.v1.RetryJobRequest - (*RetryJobResponse)(nil), // 14: depot.ci.v1.RetryJobResponse - (*RerunWorkflowRequest)(nil), // 15: depot.ci.v1.RerunWorkflowRequest - (*RerunWorkflowResponse)(nil), // 16: depot.ci.v1.RerunWorkflowResponse - (*RetryFailedJobsRequest)(nil), // 17: depot.ci.v1.RetryFailedJobsRequest - (*RetryFailedJobsResponse)(nil), // 18: depot.ci.v1.RetryFailedJobsResponse - (*CancelJobRequest)(nil), // 19: depot.ci.v1.CancelJobRequest - (*CancelJobResponse)(nil), // 20: depot.ci.v1.CancelJobResponse - (*CancelWorkflowRequest)(nil), // 21: depot.ci.v1.CancelWorkflowRequest - (*CancelWorkflowResponse)(nil), // 22: depot.ci.v1.CancelWorkflowResponse - (*GetRunRequest)(nil), // 23: depot.ci.v1.GetRunRequest - (*GetRunResponse)(nil), // 24: depot.ci.v1.GetRunResponse - (*CancelRunRequest)(nil), // 25: depot.ci.v1.CancelRunRequest - (*CancelRunResponse)(nil), // 26: depot.ci.v1.CancelRunResponse - (*GetRunStatusRequest)(nil), // 27: depot.ci.v1.GetRunStatusRequest - (*GetRunStatusResponse)(nil), // 28: depot.ci.v1.GetRunStatusResponse - (*WorkflowStatus)(nil), // 29: depot.ci.v1.WorkflowStatus - (*JobStatus)(nil), // 30: depot.ci.v1.JobStatus - (*AttemptStatus)(nil), // 31: depot.ci.v1.AttemptStatus - (*GetWorkflowRequest)(nil), // 32: depot.ci.v1.GetWorkflowRequest - (*GetWorkflowResponse)(nil), // 33: depot.ci.v1.GetWorkflowResponse - (*GetWorkflowExecution)(nil), // 34: depot.ci.v1.GetWorkflowExecution - (*GetWorkflowJob)(nil), // 35: depot.ci.v1.GetWorkflowJob - (*GetWorkflowJobAttempt)(nil), // 36: depot.ci.v1.GetWorkflowJobAttempt - (*GetJobAttemptMetricsRequest)(nil), // 37: depot.ci.v1.GetJobAttemptMetricsRequest - (*GetJobMetricsRequest)(nil), // 38: depot.ci.v1.GetJobMetricsRequest - (*GetRunMetricsRequest)(nil), // 39: depot.ci.v1.GetRunMetricsRequest - (*GetJobAttemptMetricsResponse)(nil), // 40: depot.ci.v1.GetJobAttemptMetricsResponse - (*GetJobMetricsResponse)(nil), // 41: depot.ci.v1.GetJobMetricsResponse - (*GetRunMetricsResponse)(nil), // 42: depot.ci.v1.GetRunMetricsResponse - (*CIMetricsWorkflowMetrics)(nil), // 43: depot.ci.v1.CIMetricsWorkflowMetrics - (*CIMetricsJobMetrics)(nil), // 44: depot.ci.v1.CIMetricsJobMetrics - (*CIMetricsAttemptMetrics)(nil), // 45: depot.ci.v1.CIMetricsAttemptMetrics - (*CIMetricsAttemptSummary)(nil), // 46: depot.ci.v1.CIMetricsAttemptSummary - (*CIMetricsRunContext)(nil), // 47: depot.ci.v1.CIMetricsRunContext - (*CIMetricsWorkflowContext)(nil), // 48: depot.ci.v1.CIMetricsWorkflowContext - (*CIMetricsJobContext)(nil), // 49: depot.ci.v1.CIMetricsJobContext - (*CIMetricsAttemptContext)(nil), // 50: depot.ci.v1.CIMetricsAttemptContext - (*CIMetricSample)(nil), // 51: depot.ci.v1.CIMetricSample - (*CIMetricsStats)(nil), // 52: depot.ci.v1.CIMetricsStats - (*CIMetricsAvailability)(nil), // 53: depot.ci.v1.CIMetricsAvailability - (*CIMetricsCapMetadata)(nil), // 54: depot.ci.v1.CIMetricsCapMetadata - (*GetJobSummaryRequest)(nil), // 55: depot.ci.v1.GetJobSummaryRequest - (*GetJobSummaryResponse)(nil), // 56: depot.ci.v1.GetJobSummaryResponse - (*GetJobAttemptLogsRequest)(nil), // 57: depot.ci.v1.GetJobAttemptLogsRequest - (*GetJobAttemptLogsResponse)(nil), // 58: depot.ci.v1.GetJobAttemptLogsResponse - (*StreamJobAttemptLogsRequest)(nil), // 59: depot.ci.v1.StreamJobAttemptLogsRequest - (*StreamJobAttemptLogsResponse)(nil), // 60: depot.ci.v1.StreamJobAttemptLogsResponse - (*ExportJobAttemptLogsRequest)(nil), // 61: depot.ci.v1.ExportJobAttemptLogsRequest - (*JobAttemptLogExportMetadata)(nil), // 62: depot.ci.v1.JobAttemptLogExportMetadata - (*ExportJobAttemptLogsResponse)(nil), // 63: depot.ci.v1.ExportJobAttemptLogsResponse - (*LogLine)(nil), // 64: depot.ci.v1.LogLine - (*ListRunsRequest)(nil), // 65: depot.ci.v1.ListRunsRequest - (*ListRunsResponse)(nil), // 66: depot.ci.v1.ListRunsResponse - (*ListRunsResponseRun)(nil), // 67: depot.ci.v1.ListRunsResponseRun - (*ListWorkflowsRequest)(nil), // 68: depot.ci.v1.ListWorkflowsRequest - (*ListWorkflowsResponse)(nil), // 69: depot.ci.v1.ListWorkflowsResponse - (*ListWorkflowsResponseWorkflow)(nil), // 70: depot.ci.v1.ListWorkflowsResponseWorkflow - (*ListWorkflowsResponseJobCounts)(nil), // 71: depot.ci.v1.ListWorkflowsResponseJobCounts - nil, // 72: depot.ci.v1.DispatchWorkflowRequest.InputsEntry + (FailureDiagnosisTargetType)(0), // 0: depot.ci.v1.FailureDiagnosisTargetType + (FailureDiagnosisState)(0), // 1: depot.ci.v1.FailureDiagnosisState + (DrillDownCommandKind)(0), // 2: depot.ci.v1.DrillDownCommandKind + (CIMetricsAvailabilityCode)(0), // 3: depot.ci.v1.CIMetricsAvailabilityCode + (JobAttemptLogExportFormat)(0), // 4: depot.ci.v1.JobAttemptLogExportFormat + (*GetInstallationRequest)(nil), // 5: depot.ci.v1.GetInstallationRequest + (*GetInstallationResponse)(nil), // 6: depot.ci.v1.GetInstallationResponse + (*ImportSecretsAndVarsRequest)(nil), // 7: depot.ci.v1.ImportSecretsAndVarsRequest + (*ImportSecretsAndVarsResponse)(nil), // 8: depot.ci.v1.ImportSecretsAndVarsResponse + (*DryRunResult)(nil), // 9: depot.ci.v1.DryRunResult + (*RunResult)(nil), // 10: depot.ci.v1.RunResult + (*Installation)(nil), // 11: depot.ci.v1.Installation + (*RunRequest)(nil), // 12: depot.ci.v1.RunRequest + (*RunResponse)(nil), // 13: depot.ci.v1.RunResponse + (*DispatchWorkflowRequest)(nil), // 14: depot.ci.v1.DispatchWorkflowRequest + (*DispatchWorkflowResponse)(nil), // 15: depot.ci.v1.DispatchWorkflowResponse + (*RetryJobRequest)(nil), // 16: depot.ci.v1.RetryJobRequest + (*RetryJobResponse)(nil), // 17: depot.ci.v1.RetryJobResponse + (*RerunWorkflowRequest)(nil), // 18: depot.ci.v1.RerunWorkflowRequest + (*RerunWorkflowResponse)(nil), // 19: depot.ci.v1.RerunWorkflowResponse + (*RetryFailedJobsRequest)(nil), // 20: depot.ci.v1.RetryFailedJobsRequest + (*RetryFailedJobsResponse)(nil), // 21: depot.ci.v1.RetryFailedJobsResponse + (*CancelJobRequest)(nil), // 22: depot.ci.v1.CancelJobRequest + (*CancelJobResponse)(nil), // 23: depot.ci.v1.CancelJobResponse + (*CancelWorkflowRequest)(nil), // 24: depot.ci.v1.CancelWorkflowRequest + (*CancelWorkflowResponse)(nil), // 25: depot.ci.v1.CancelWorkflowResponse + (*GetRunRequest)(nil), // 26: depot.ci.v1.GetRunRequest + (*GetRunResponse)(nil), // 27: depot.ci.v1.GetRunResponse + (*CancelRunRequest)(nil), // 28: depot.ci.v1.CancelRunRequest + (*CancelRunResponse)(nil), // 29: depot.ci.v1.CancelRunResponse + (*GetRunStatusRequest)(nil), // 30: depot.ci.v1.GetRunStatusRequest + (*GetRunStatusResponse)(nil), // 31: depot.ci.v1.GetRunStatusResponse + (*WorkflowStatus)(nil), // 32: depot.ci.v1.WorkflowStatus + (*JobStatus)(nil), // 33: depot.ci.v1.JobStatus + (*AttemptStatus)(nil), // 34: depot.ci.v1.AttemptStatus + (*GetWorkflowRequest)(nil), // 35: depot.ci.v1.GetWorkflowRequest + (*GetWorkflowResponse)(nil), // 36: depot.ci.v1.GetWorkflowResponse + (*GetWorkflowExecution)(nil), // 37: depot.ci.v1.GetWorkflowExecution + (*GetWorkflowJob)(nil), // 38: depot.ci.v1.GetWorkflowJob + (*GetWorkflowJobAttempt)(nil), // 39: depot.ci.v1.GetWorkflowJobAttempt + (*GetFailureDiagnosisRequest)(nil), // 40: depot.ci.v1.GetFailureDiagnosisRequest + (*FailureDiagnosis)(nil), // 41: depot.ci.v1.FailureDiagnosis + (*FailureDiagnosisTarget)(nil), // 42: depot.ci.v1.FailureDiagnosisTarget + (*FailureDiagnosisContext)(nil), // 43: depot.ci.v1.FailureDiagnosisContext + (*FailureGroup)(nil), // 44: depot.ci.v1.FailureGroup + (*RepresentativeAttempt)(nil), // 45: depot.ci.v1.RepresentativeAttempt + (*RelevantErrorLine)(nil), // 46: depot.ci.v1.RelevantErrorLine + (*FailureDiagnosisBounds)(nil), // 47: depot.ci.v1.FailureDiagnosisBounds + (*DrillDownCommand)(nil), // 48: depot.ci.v1.DrillDownCommand + (*FailureDiagnosisCommandCapabilities)(nil), // 49: depot.ci.v1.FailureDiagnosisCommandCapabilities + (*FailureDiagnosisBreakdownRow)(nil), // 50: depot.ci.v1.FailureDiagnosisBreakdownRow + (*GetJobAttemptMetricsRequest)(nil), // 51: depot.ci.v1.GetJobAttemptMetricsRequest + (*GetJobMetricsRequest)(nil), // 52: depot.ci.v1.GetJobMetricsRequest + (*GetRunMetricsRequest)(nil), // 53: depot.ci.v1.GetRunMetricsRequest + (*GetJobAttemptMetricsResponse)(nil), // 54: depot.ci.v1.GetJobAttemptMetricsResponse + (*GetJobMetricsResponse)(nil), // 55: depot.ci.v1.GetJobMetricsResponse + (*GetRunMetricsResponse)(nil), // 56: depot.ci.v1.GetRunMetricsResponse + (*CIMetricsWorkflowMetrics)(nil), // 57: depot.ci.v1.CIMetricsWorkflowMetrics + (*CIMetricsJobMetrics)(nil), // 58: depot.ci.v1.CIMetricsJobMetrics + (*CIMetricsAttemptMetrics)(nil), // 59: depot.ci.v1.CIMetricsAttemptMetrics + (*CIMetricsAttemptSummary)(nil), // 60: depot.ci.v1.CIMetricsAttemptSummary + (*CIMetricsRunContext)(nil), // 61: depot.ci.v1.CIMetricsRunContext + (*CIMetricsWorkflowContext)(nil), // 62: depot.ci.v1.CIMetricsWorkflowContext + (*CIMetricsJobContext)(nil), // 63: depot.ci.v1.CIMetricsJobContext + (*CIMetricsAttemptContext)(nil), // 64: depot.ci.v1.CIMetricsAttemptContext + (*CIMetricSample)(nil), // 65: depot.ci.v1.CIMetricSample + (*CIMetricsStats)(nil), // 66: depot.ci.v1.CIMetricsStats + (*CIMetricsAvailability)(nil), // 67: depot.ci.v1.CIMetricsAvailability + (*CIMetricsCapMetadata)(nil), // 68: depot.ci.v1.CIMetricsCapMetadata + (*GetJobSummaryRequest)(nil), // 69: depot.ci.v1.GetJobSummaryRequest + (*GetJobSummaryResponse)(nil), // 70: depot.ci.v1.GetJobSummaryResponse + (*GetJobAttemptLogsRequest)(nil), // 71: depot.ci.v1.GetJobAttemptLogsRequest + (*GetJobAttemptLogsResponse)(nil), // 72: depot.ci.v1.GetJobAttemptLogsResponse + (*StreamJobAttemptLogsRequest)(nil), // 73: depot.ci.v1.StreamJobAttemptLogsRequest + (*StreamJobAttemptLogsResponse)(nil), // 74: depot.ci.v1.StreamJobAttemptLogsResponse + (*ExportJobAttemptLogsRequest)(nil), // 75: depot.ci.v1.ExportJobAttemptLogsRequest + (*JobAttemptLogExportMetadata)(nil), // 76: depot.ci.v1.JobAttemptLogExportMetadata + (*ExportJobAttemptLogsResponse)(nil), // 77: depot.ci.v1.ExportJobAttemptLogsResponse + (*LogLine)(nil), // 78: depot.ci.v1.LogLine + (*ListRunsRequest)(nil), // 79: depot.ci.v1.ListRunsRequest + (*ListRunsResponse)(nil), // 80: depot.ci.v1.ListRunsResponse + (*ListRunsResponseRun)(nil), // 81: depot.ci.v1.ListRunsResponseRun + (*ListWorkflowsRequest)(nil), // 82: depot.ci.v1.ListWorkflowsRequest + (*ListWorkflowsResponse)(nil), // 83: depot.ci.v1.ListWorkflowsResponse + (*ListWorkflowsResponseWorkflow)(nil), // 84: depot.ci.v1.ListWorkflowsResponseWorkflow + (*ListWorkflowsResponseJobCounts)(nil), // 85: depot.ci.v1.ListWorkflowsResponseJobCounts + nil, // 86: depot.ci.v1.DispatchWorkflowRequest.InputsEntry } var file_depot_ci_v1_ci_proto_depIdxs = []int32{ - 8, // 0: depot.ci.v1.GetInstallationResponse.installations:type_name -> depot.ci.v1.Installation - 6, // 1: depot.ci.v1.ImportSecretsAndVarsResponse.dry_run_result:type_name -> depot.ci.v1.DryRunResult - 7, // 2: depot.ci.v1.ImportSecretsAndVarsResponse.run_result:type_name -> depot.ci.v1.RunResult - 72, // 3: depot.ci.v1.DispatchWorkflowRequest.inputs:type_name -> depot.ci.v1.DispatchWorkflowRequest.InputsEntry - 29, // 4: depot.ci.v1.GetRunStatusResponse.workflows:type_name -> depot.ci.v1.WorkflowStatus - 30, // 5: depot.ci.v1.WorkflowStatus.jobs:type_name -> depot.ci.v1.JobStatus - 31, // 6: depot.ci.v1.JobStatus.attempts:type_name -> depot.ci.v1.AttemptStatus - 34, // 7: depot.ci.v1.GetWorkflowResponse.executions:type_name -> depot.ci.v1.GetWorkflowExecution - 35, // 8: depot.ci.v1.GetWorkflowResponse.jobs:type_name -> depot.ci.v1.GetWorkflowJob - 36, // 9: depot.ci.v1.GetWorkflowJob.attempts:type_name -> depot.ci.v1.GetWorkflowJobAttempt - 47, // 10: depot.ci.v1.GetJobAttemptMetricsResponse.run:type_name -> depot.ci.v1.CIMetricsRunContext - 48, // 11: depot.ci.v1.GetJobAttemptMetricsResponse.workflow:type_name -> depot.ci.v1.CIMetricsWorkflowContext - 49, // 12: depot.ci.v1.GetJobAttemptMetricsResponse.job:type_name -> depot.ci.v1.CIMetricsJobContext - 45, // 13: depot.ci.v1.GetJobAttemptMetricsResponse.attempt:type_name -> depot.ci.v1.CIMetricsAttemptMetrics - 47, // 14: depot.ci.v1.GetJobMetricsResponse.run:type_name -> depot.ci.v1.CIMetricsRunContext - 48, // 15: depot.ci.v1.GetJobMetricsResponse.workflow:type_name -> depot.ci.v1.CIMetricsWorkflowContext - 49, // 16: depot.ci.v1.GetJobMetricsResponse.job:type_name -> depot.ci.v1.CIMetricsJobContext - 46, // 17: depot.ci.v1.GetJobMetricsResponse.attempts:type_name -> depot.ci.v1.CIMetricsAttemptSummary - 47, // 18: depot.ci.v1.GetRunMetricsResponse.run:type_name -> depot.ci.v1.CIMetricsRunContext - 43, // 19: depot.ci.v1.GetRunMetricsResponse.workflows:type_name -> depot.ci.v1.CIMetricsWorkflowMetrics - 48, // 20: depot.ci.v1.CIMetricsWorkflowMetrics.workflow:type_name -> depot.ci.v1.CIMetricsWorkflowContext - 44, // 21: depot.ci.v1.CIMetricsWorkflowMetrics.jobs:type_name -> depot.ci.v1.CIMetricsJobMetrics - 49, // 22: depot.ci.v1.CIMetricsJobMetrics.job:type_name -> depot.ci.v1.CIMetricsJobContext - 46, // 23: depot.ci.v1.CIMetricsJobMetrics.attempts:type_name -> depot.ci.v1.CIMetricsAttemptSummary - 50, // 24: depot.ci.v1.CIMetricsAttemptMetrics.attempt:type_name -> depot.ci.v1.CIMetricsAttemptContext - 53, // 25: depot.ci.v1.CIMetricsAttemptMetrics.availability:type_name -> depot.ci.v1.CIMetricsAvailability - 52, // 26: depot.ci.v1.CIMetricsAttemptMetrics.stats:type_name -> depot.ci.v1.CIMetricsStats - 54, // 27: depot.ci.v1.CIMetricsAttemptMetrics.cap:type_name -> depot.ci.v1.CIMetricsCapMetadata - 51, // 28: depot.ci.v1.CIMetricsAttemptMetrics.samples:type_name -> depot.ci.v1.CIMetricSample - 50, // 29: depot.ci.v1.CIMetricsAttemptSummary.attempt:type_name -> depot.ci.v1.CIMetricsAttemptContext - 53, // 30: depot.ci.v1.CIMetricsAttemptSummary.availability:type_name -> depot.ci.v1.CIMetricsAvailability - 52, // 31: depot.ci.v1.CIMetricsAttemptSummary.stats:type_name -> depot.ci.v1.CIMetricsStats - 54, // 32: depot.ci.v1.CIMetricsAttemptSummary.cap:type_name -> depot.ci.v1.CIMetricsCapMetadata - 0, // 33: depot.ci.v1.CIMetricsAvailability.code:type_name -> depot.ci.v1.CIMetricsAvailabilityCode - 64, // 34: depot.ci.v1.GetJobAttemptLogsResponse.lines:type_name -> depot.ci.v1.LogLine - 64, // 35: depot.ci.v1.StreamJobAttemptLogsResponse.line:type_name -> depot.ci.v1.LogLine - 1, // 36: depot.ci.v1.ExportJobAttemptLogsRequest.format:type_name -> depot.ci.v1.JobAttemptLogExportFormat - 1, // 37: depot.ci.v1.JobAttemptLogExportMetadata.format:type_name -> depot.ci.v1.JobAttemptLogExportFormat - 62, // 38: depot.ci.v1.ExportJobAttemptLogsResponse.metadata:type_name -> depot.ci.v1.JobAttemptLogExportMetadata - 67, // 39: depot.ci.v1.ListRunsResponse.runs:type_name -> depot.ci.v1.ListRunsResponseRun - 70, // 40: depot.ci.v1.ListWorkflowsResponse.workflows:type_name -> depot.ci.v1.ListWorkflowsResponseWorkflow - 71, // 41: depot.ci.v1.ListWorkflowsResponseWorkflow.job_counts:type_name -> depot.ci.v1.ListWorkflowsResponseJobCounts - 9, // 42: depot.ci.v1.CIService.Run:input_type -> depot.ci.v1.RunRequest - 11, // 43: depot.ci.v1.CIService.DispatchWorkflow:input_type -> depot.ci.v1.DispatchWorkflowRequest - 13, // 44: depot.ci.v1.CIService.RetryJob:input_type -> depot.ci.v1.RetryJobRequest - 15, // 45: depot.ci.v1.CIService.RerunWorkflow:input_type -> depot.ci.v1.RerunWorkflowRequest - 17, // 46: depot.ci.v1.CIService.RetryFailedJobs:input_type -> depot.ci.v1.RetryFailedJobsRequest - 19, // 47: depot.ci.v1.CIService.CancelJob:input_type -> depot.ci.v1.CancelJobRequest - 21, // 48: depot.ci.v1.CIService.CancelWorkflow:input_type -> depot.ci.v1.CancelWorkflowRequest - 23, // 49: depot.ci.v1.CIService.GetRun:input_type -> depot.ci.v1.GetRunRequest - 25, // 50: depot.ci.v1.CIService.CancelRun:input_type -> depot.ci.v1.CancelRunRequest - 27, // 51: depot.ci.v1.CIService.GetRunStatus:input_type -> depot.ci.v1.GetRunStatusRequest - 32, // 52: depot.ci.v1.CIService.GetWorkflow:input_type -> depot.ci.v1.GetWorkflowRequest - 37, // 53: depot.ci.v1.CIService.GetJobAttemptMetrics:input_type -> depot.ci.v1.GetJobAttemptMetricsRequest - 38, // 54: depot.ci.v1.CIService.GetJobMetrics:input_type -> depot.ci.v1.GetJobMetricsRequest - 39, // 55: depot.ci.v1.CIService.GetRunMetrics:input_type -> depot.ci.v1.GetRunMetricsRequest - 55, // 56: depot.ci.v1.CIService.GetJobSummary:input_type -> depot.ci.v1.GetJobSummaryRequest - 57, // 57: depot.ci.v1.CIService.GetJobAttemptLogs:input_type -> depot.ci.v1.GetJobAttemptLogsRequest - 59, // 58: depot.ci.v1.CIService.StreamJobAttemptLogs:input_type -> depot.ci.v1.StreamJobAttemptLogsRequest - 61, // 59: depot.ci.v1.CIService.ExportJobAttemptLogs:input_type -> depot.ci.v1.ExportJobAttemptLogsRequest - 65, // 60: depot.ci.v1.CIService.ListRuns:input_type -> depot.ci.v1.ListRunsRequest - 68, // 61: depot.ci.v1.CIService.ListWorkflows:input_type -> depot.ci.v1.ListWorkflowsRequest - 2, // 62: depot.ci.v1.MigrationService.GetInstallation:input_type -> depot.ci.v1.GetInstallationRequest - 4, // 63: depot.ci.v1.MigrationService.ImportSecretsAndVars:input_type -> depot.ci.v1.ImportSecretsAndVarsRequest - 10, // 64: depot.ci.v1.CIService.Run:output_type -> depot.ci.v1.RunResponse - 12, // 65: depot.ci.v1.CIService.DispatchWorkflow:output_type -> depot.ci.v1.DispatchWorkflowResponse - 14, // 66: depot.ci.v1.CIService.RetryJob:output_type -> depot.ci.v1.RetryJobResponse - 16, // 67: depot.ci.v1.CIService.RerunWorkflow:output_type -> depot.ci.v1.RerunWorkflowResponse - 18, // 68: depot.ci.v1.CIService.RetryFailedJobs:output_type -> depot.ci.v1.RetryFailedJobsResponse - 20, // 69: depot.ci.v1.CIService.CancelJob:output_type -> depot.ci.v1.CancelJobResponse - 22, // 70: depot.ci.v1.CIService.CancelWorkflow:output_type -> depot.ci.v1.CancelWorkflowResponse - 24, // 71: depot.ci.v1.CIService.GetRun:output_type -> depot.ci.v1.GetRunResponse - 26, // 72: depot.ci.v1.CIService.CancelRun:output_type -> depot.ci.v1.CancelRunResponse - 28, // 73: depot.ci.v1.CIService.GetRunStatus:output_type -> depot.ci.v1.GetRunStatusResponse - 33, // 74: depot.ci.v1.CIService.GetWorkflow:output_type -> depot.ci.v1.GetWorkflowResponse - 40, // 75: depot.ci.v1.CIService.GetJobAttemptMetrics:output_type -> depot.ci.v1.GetJobAttemptMetricsResponse - 41, // 76: depot.ci.v1.CIService.GetJobMetrics:output_type -> depot.ci.v1.GetJobMetricsResponse - 42, // 77: depot.ci.v1.CIService.GetRunMetrics:output_type -> depot.ci.v1.GetRunMetricsResponse - 56, // 78: depot.ci.v1.CIService.GetJobSummary:output_type -> depot.ci.v1.GetJobSummaryResponse - 58, // 79: depot.ci.v1.CIService.GetJobAttemptLogs:output_type -> depot.ci.v1.GetJobAttemptLogsResponse - 60, // 80: depot.ci.v1.CIService.StreamJobAttemptLogs:output_type -> depot.ci.v1.StreamJobAttemptLogsResponse - 63, // 81: depot.ci.v1.CIService.ExportJobAttemptLogs:output_type -> depot.ci.v1.ExportJobAttemptLogsResponse - 66, // 82: depot.ci.v1.CIService.ListRuns:output_type -> depot.ci.v1.ListRunsResponse - 69, // 83: depot.ci.v1.CIService.ListWorkflows:output_type -> depot.ci.v1.ListWorkflowsResponse - 3, // 84: depot.ci.v1.MigrationService.GetInstallation:output_type -> depot.ci.v1.GetInstallationResponse - 5, // 85: depot.ci.v1.MigrationService.ImportSecretsAndVars:output_type -> depot.ci.v1.ImportSecretsAndVarsResponse - 64, // [64:86] is the sub-list for method output_type - 42, // [42:64] is the sub-list for method input_type - 42, // [42:42] is the sub-list for extension type_name - 42, // [42:42] is the sub-list for extension extendee - 0, // [0:42] is the sub-list for field type_name + 11, // 0: depot.ci.v1.GetInstallationResponse.installations:type_name -> depot.ci.v1.Installation + 9, // 1: depot.ci.v1.ImportSecretsAndVarsResponse.dry_run_result:type_name -> depot.ci.v1.DryRunResult + 10, // 2: depot.ci.v1.ImportSecretsAndVarsResponse.run_result:type_name -> depot.ci.v1.RunResult + 86, // 3: depot.ci.v1.DispatchWorkflowRequest.inputs:type_name -> depot.ci.v1.DispatchWorkflowRequest.InputsEntry + 32, // 4: depot.ci.v1.GetRunStatusResponse.workflows:type_name -> depot.ci.v1.WorkflowStatus + 33, // 5: depot.ci.v1.WorkflowStatus.jobs:type_name -> depot.ci.v1.JobStatus + 34, // 6: depot.ci.v1.JobStatus.attempts:type_name -> depot.ci.v1.AttemptStatus + 37, // 7: depot.ci.v1.GetWorkflowResponse.executions:type_name -> depot.ci.v1.GetWorkflowExecution + 38, // 8: depot.ci.v1.GetWorkflowResponse.jobs:type_name -> depot.ci.v1.GetWorkflowJob + 39, // 9: depot.ci.v1.GetWorkflowJob.attempts:type_name -> depot.ci.v1.GetWorkflowJobAttempt + 0, // 10: depot.ci.v1.GetFailureDiagnosisRequest.target_type:type_name -> depot.ci.v1.FailureDiagnosisTargetType + 42, // 11: depot.ci.v1.FailureDiagnosis.target:type_name -> depot.ci.v1.FailureDiagnosisTarget + 43, // 12: depot.ci.v1.FailureDiagnosis.context:type_name -> depot.ci.v1.FailureDiagnosisContext + 1, // 13: depot.ci.v1.FailureDiagnosis.state:type_name -> depot.ci.v1.FailureDiagnosisState + 44, // 14: depot.ci.v1.FailureDiagnosis.failure_groups:type_name -> depot.ci.v1.FailureGroup + 45, // 15: depot.ci.v1.FailureDiagnosis.representative_attempts:type_name -> depot.ci.v1.RepresentativeAttempt + 47, // 16: depot.ci.v1.FailureDiagnosis.bounds:type_name -> depot.ci.v1.FailureDiagnosisBounds + 48, // 17: depot.ci.v1.FailureDiagnosis.next_commands:type_name -> depot.ci.v1.DrillDownCommand + 49, // 18: depot.ci.v1.FailureDiagnosis.command_capabilities:type_name -> depot.ci.v1.FailureDiagnosisCommandCapabilities + 50, // 19: depot.ci.v1.FailureDiagnosis.over_limit_breakdown:type_name -> depot.ci.v1.FailureDiagnosisBreakdownRow + 0, // 20: depot.ci.v1.FailureDiagnosisTarget.target_type:type_name -> depot.ci.v1.FailureDiagnosisTargetType + 45, // 21: depot.ci.v1.FailureGroup.representatives:type_name -> depot.ci.v1.RepresentativeAttempt + 46, // 22: depot.ci.v1.RepresentativeAttempt.relevant_lines:type_name -> depot.ci.v1.RelevantErrorLine + 48, // 23: depot.ci.v1.RepresentativeAttempt.next_commands:type_name -> depot.ci.v1.DrillDownCommand + 2, // 24: depot.ci.v1.DrillDownCommand.kind:type_name -> depot.ci.v1.DrillDownCommandKind + 0, // 25: depot.ci.v1.FailureDiagnosisBreakdownRow.target_type:type_name -> depot.ci.v1.FailureDiagnosisTargetType + 48, // 26: depot.ci.v1.FailureDiagnosisBreakdownRow.next_commands:type_name -> depot.ci.v1.DrillDownCommand + 61, // 27: depot.ci.v1.GetJobAttemptMetricsResponse.run:type_name -> depot.ci.v1.CIMetricsRunContext + 62, // 28: depot.ci.v1.GetJobAttemptMetricsResponse.workflow:type_name -> depot.ci.v1.CIMetricsWorkflowContext + 63, // 29: depot.ci.v1.GetJobAttemptMetricsResponse.job:type_name -> depot.ci.v1.CIMetricsJobContext + 59, // 30: depot.ci.v1.GetJobAttemptMetricsResponse.attempt:type_name -> depot.ci.v1.CIMetricsAttemptMetrics + 61, // 31: depot.ci.v1.GetJobMetricsResponse.run:type_name -> depot.ci.v1.CIMetricsRunContext + 62, // 32: depot.ci.v1.GetJobMetricsResponse.workflow:type_name -> depot.ci.v1.CIMetricsWorkflowContext + 63, // 33: depot.ci.v1.GetJobMetricsResponse.job:type_name -> depot.ci.v1.CIMetricsJobContext + 60, // 34: depot.ci.v1.GetJobMetricsResponse.attempts:type_name -> depot.ci.v1.CIMetricsAttemptSummary + 61, // 35: depot.ci.v1.GetRunMetricsResponse.run:type_name -> depot.ci.v1.CIMetricsRunContext + 57, // 36: depot.ci.v1.GetRunMetricsResponse.workflows:type_name -> depot.ci.v1.CIMetricsWorkflowMetrics + 62, // 37: depot.ci.v1.CIMetricsWorkflowMetrics.workflow:type_name -> depot.ci.v1.CIMetricsWorkflowContext + 58, // 38: depot.ci.v1.CIMetricsWorkflowMetrics.jobs:type_name -> depot.ci.v1.CIMetricsJobMetrics + 63, // 39: depot.ci.v1.CIMetricsJobMetrics.job:type_name -> depot.ci.v1.CIMetricsJobContext + 60, // 40: depot.ci.v1.CIMetricsJobMetrics.attempts:type_name -> depot.ci.v1.CIMetricsAttemptSummary + 64, // 41: depot.ci.v1.CIMetricsAttemptMetrics.attempt:type_name -> depot.ci.v1.CIMetricsAttemptContext + 67, // 42: depot.ci.v1.CIMetricsAttemptMetrics.availability:type_name -> depot.ci.v1.CIMetricsAvailability + 66, // 43: depot.ci.v1.CIMetricsAttemptMetrics.stats:type_name -> depot.ci.v1.CIMetricsStats + 68, // 44: depot.ci.v1.CIMetricsAttemptMetrics.cap:type_name -> depot.ci.v1.CIMetricsCapMetadata + 65, // 45: depot.ci.v1.CIMetricsAttemptMetrics.samples:type_name -> depot.ci.v1.CIMetricSample + 64, // 46: depot.ci.v1.CIMetricsAttemptSummary.attempt:type_name -> depot.ci.v1.CIMetricsAttemptContext + 67, // 47: depot.ci.v1.CIMetricsAttemptSummary.availability:type_name -> depot.ci.v1.CIMetricsAvailability + 66, // 48: depot.ci.v1.CIMetricsAttemptSummary.stats:type_name -> depot.ci.v1.CIMetricsStats + 68, // 49: depot.ci.v1.CIMetricsAttemptSummary.cap:type_name -> depot.ci.v1.CIMetricsCapMetadata + 3, // 50: depot.ci.v1.CIMetricsAvailability.code:type_name -> depot.ci.v1.CIMetricsAvailabilityCode + 78, // 51: depot.ci.v1.GetJobAttemptLogsResponse.lines:type_name -> depot.ci.v1.LogLine + 78, // 52: depot.ci.v1.StreamJobAttemptLogsResponse.line:type_name -> depot.ci.v1.LogLine + 4, // 53: depot.ci.v1.ExportJobAttemptLogsRequest.format:type_name -> depot.ci.v1.JobAttemptLogExportFormat + 4, // 54: depot.ci.v1.JobAttemptLogExportMetadata.format:type_name -> depot.ci.v1.JobAttemptLogExportFormat + 76, // 55: depot.ci.v1.ExportJobAttemptLogsResponse.metadata:type_name -> depot.ci.v1.JobAttemptLogExportMetadata + 81, // 56: depot.ci.v1.ListRunsResponse.runs:type_name -> depot.ci.v1.ListRunsResponseRun + 84, // 57: depot.ci.v1.ListWorkflowsResponse.workflows:type_name -> depot.ci.v1.ListWorkflowsResponseWorkflow + 85, // 58: depot.ci.v1.ListWorkflowsResponseWorkflow.job_counts:type_name -> depot.ci.v1.ListWorkflowsResponseJobCounts + 12, // 59: depot.ci.v1.CIService.Run:input_type -> depot.ci.v1.RunRequest + 14, // 60: depot.ci.v1.CIService.DispatchWorkflow:input_type -> depot.ci.v1.DispatchWorkflowRequest + 16, // 61: depot.ci.v1.CIService.RetryJob:input_type -> depot.ci.v1.RetryJobRequest + 18, // 62: depot.ci.v1.CIService.RerunWorkflow:input_type -> depot.ci.v1.RerunWorkflowRequest + 20, // 63: depot.ci.v1.CIService.RetryFailedJobs:input_type -> depot.ci.v1.RetryFailedJobsRequest + 22, // 64: depot.ci.v1.CIService.CancelJob:input_type -> depot.ci.v1.CancelJobRequest + 24, // 65: depot.ci.v1.CIService.CancelWorkflow:input_type -> depot.ci.v1.CancelWorkflowRequest + 26, // 66: depot.ci.v1.CIService.GetRun:input_type -> depot.ci.v1.GetRunRequest + 28, // 67: depot.ci.v1.CIService.CancelRun:input_type -> depot.ci.v1.CancelRunRequest + 30, // 68: depot.ci.v1.CIService.GetRunStatus:input_type -> depot.ci.v1.GetRunStatusRequest + 35, // 69: depot.ci.v1.CIService.GetWorkflow:input_type -> depot.ci.v1.GetWorkflowRequest + 40, // 70: depot.ci.v1.CIService.GetFailureDiagnosis:input_type -> depot.ci.v1.GetFailureDiagnosisRequest + 51, // 71: depot.ci.v1.CIService.GetJobAttemptMetrics:input_type -> depot.ci.v1.GetJobAttemptMetricsRequest + 52, // 72: depot.ci.v1.CIService.GetJobMetrics:input_type -> depot.ci.v1.GetJobMetricsRequest + 53, // 73: depot.ci.v1.CIService.GetRunMetrics:input_type -> depot.ci.v1.GetRunMetricsRequest + 69, // 74: depot.ci.v1.CIService.GetJobSummary:input_type -> depot.ci.v1.GetJobSummaryRequest + 71, // 75: depot.ci.v1.CIService.GetJobAttemptLogs:input_type -> depot.ci.v1.GetJobAttemptLogsRequest + 73, // 76: depot.ci.v1.CIService.StreamJobAttemptLogs:input_type -> depot.ci.v1.StreamJobAttemptLogsRequest + 75, // 77: depot.ci.v1.CIService.ExportJobAttemptLogs:input_type -> depot.ci.v1.ExportJobAttemptLogsRequest + 79, // 78: depot.ci.v1.CIService.ListRuns:input_type -> depot.ci.v1.ListRunsRequest + 82, // 79: depot.ci.v1.CIService.ListWorkflows:input_type -> depot.ci.v1.ListWorkflowsRequest + 5, // 80: depot.ci.v1.MigrationService.GetInstallation:input_type -> depot.ci.v1.GetInstallationRequest + 7, // 81: depot.ci.v1.MigrationService.ImportSecretsAndVars:input_type -> depot.ci.v1.ImportSecretsAndVarsRequest + 13, // 82: depot.ci.v1.CIService.Run:output_type -> depot.ci.v1.RunResponse + 15, // 83: depot.ci.v1.CIService.DispatchWorkflow:output_type -> depot.ci.v1.DispatchWorkflowResponse + 17, // 84: depot.ci.v1.CIService.RetryJob:output_type -> depot.ci.v1.RetryJobResponse + 19, // 85: depot.ci.v1.CIService.RerunWorkflow:output_type -> depot.ci.v1.RerunWorkflowResponse + 21, // 86: depot.ci.v1.CIService.RetryFailedJobs:output_type -> depot.ci.v1.RetryFailedJobsResponse + 23, // 87: depot.ci.v1.CIService.CancelJob:output_type -> depot.ci.v1.CancelJobResponse + 25, // 88: depot.ci.v1.CIService.CancelWorkflow:output_type -> depot.ci.v1.CancelWorkflowResponse + 27, // 89: depot.ci.v1.CIService.GetRun:output_type -> depot.ci.v1.GetRunResponse + 29, // 90: depot.ci.v1.CIService.CancelRun:output_type -> depot.ci.v1.CancelRunResponse + 31, // 91: depot.ci.v1.CIService.GetRunStatus:output_type -> depot.ci.v1.GetRunStatusResponse + 36, // 92: depot.ci.v1.CIService.GetWorkflow:output_type -> depot.ci.v1.GetWorkflowResponse + 41, // 93: depot.ci.v1.CIService.GetFailureDiagnosis:output_type -> depot.ci.v1.FailureDiagnosis + 54, // 94: depot.ci.v1.CIService.GetJobAttemptMetrics:output_type -> depot.ci.v1.GetJobAttemptMetricsResponse + 55, // 95: depot.ci.v1.CIService.GetJobMetrics:output_type -> depot.ci.v1.GetJobMetricsResponse + 56, // 96: depot.ci.v1.CIService.GetRunMetrics:output_type -> depot.ci.v1.GetRunMetricsResponse + 70, // 97: depot.ci.v1.CIService.GetJobSummary:output_type -> depot.ci.v1.GetJobSummaryResponse + 72, // 98: depot.ci.v1.CIService.GetJobAttemptLogs:output_type -> depot.ci.v1.GetJobAttemptLogsResponse + 74, // 99: depot.ci.v1.CIService.StreamJobAttemptLogs:output_type -> depot.ci.v1.StreamJobAttemptLogsResponse + 77, // 100: depot.ci.v1.CIService.ExportJobAttemptLogs:output_type -> depot.ci.v1.ExportJobAttemptLogsResponse + 80, // 101: depot.ci.v1.CIService.ListRuns:output_type -> depot.ci.v1.ListRunsResponse + 83, // 102: depot.ci.v1.CIService.ListWorkflows:output_type -> depot.ci.v1.ListWorkflowsResponse + 6, // 103: depot.ci.v1.MigrationService.GetInstallation:output_type -> depot.ci.v1.GetInstallationResponse + 8, // 104: depot.ci.v1.MigrationService.ImportSecretsAndVars:output_type -> depot.ci.v1.ImportSecretsAndVarsResponse + 82, // [82:105] is the sub-list for method output_type + 59, // [59:82] is the sub-list for method input_type + 59, // [59:59] is the sub-list for extension type_name + 59, // [59:59] is the sub-list for extension extendee + 0, // [0:59] is the sub-list for field type_name } func init() { file_depot_ci_v1_ci_proto_init() } @@ -6968,7 +8803,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetJobAttemptMetricsRequest); i { + switch v := v.(*GetFailureDiagnosisRequest); i { case 0: return &v.state case 1: @@ -6980,7 +8815,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetJobMetricsRequest); i { + switch v := v.(*FailureDiagnosis); i { case 0: return &v.state case 1: @@ -6992,7 +8827,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetRunMetricsRequest); i { + switch v := v.(*FailureDiagnosisTarget); i { case 0: return &v.state case 1: @@ -7004,7 +8839,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetJobAttemptMetricsResponse); i { + switch v := v.(*FailureDiagnosisContext); i { case 0: return &v.state case 1: @@ -7016,7 +8851,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetJobMetricsResponse); i { + switch v := v.(*FailureGroup); i { case 0: return &v.state case 1: @@ -7028,7 +8863,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetRunMetricsResponse); i { + switch v := v.(*RepresentativeAttempt); i { case 0: return &v.state case 1: @@ -7040,7 +8875,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CIMetricsWorkflowMetrics); i { + switch v := v.(*RelevantErrorLine); i { case 0: return &v.state case 1: @@ -7052,7 +8887,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CIMetricsJobMetrics); i { + switch v := v.(*FailureDiagnosisBounds); i { case 0: return &v.state case 1: @@ -7064,7 +8899,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CIMetricsAttemptMetrics); i { + switch v := v.(*DrillDownCommand); i { case 0: return &v.state case 1: @@ -7076,7 +8911,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CIMetricsAttemptSummary); i { + switch v := v.(*FailureDiagnosisCommandCapabilities); i { case 0: return &v.state case 1: @@ -7088,7 +8923,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CIMetricsRunContext); i { + switch v := v.(*FailureDiagnosisBreakdownRow); i { case 0: return &v.state case 1: @@ -7100,7 +8935,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CIMetricsWorkflowContext); i { + switch v := v.(*GetJobAttemptMetricsRequest); i { case 0: return &v.state case 1: @@ -7112,7 +8947,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CIMetricsJobContext); i { + switch v := v.(*GetJobMetricsRequest); i { case 0: return &v.state case 1: @@ -7124,7 +8959,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CIMetricsAttemptContext); i { + switch v := v.(*GetRunMetricsRequest); i { case 0: return &v.state case 1: @@ -7136,7 +8971,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CIMetricSample); i { + switch v := v.(*GetJobAttemptMetricsResponse); i { case 0: return &v.state case 1: @@ -7148,7 +8983,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CIMetricsStats); i { + switch v := v.(*GetJobMetricsResponse); i { case 0: return &v.state case 1: @@ -7160,7 +8995,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CIMetricsAvailability); i { + switch v := v.(*GetRunMetricsResponse); i { case 0: return &v.state case 1: @@ -7172,7 +9007,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CIMetricsCapMetadata); i { + switch v := v.(*CIMetricsWorkflowMetrics); i { case 0: return &v.state case 1: @@ -7184,7 +9019,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetJobSummaryRequest); i { + switch v := v.(*CIMetricsJobMetrics); i { case 0: return &v.state case 1: @@ -7196,7 +9031,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetJobSummaryResponse); i { + switch v := v.(*CIMetricsAttemptMetrics); i { case 0: return &v.state case 1: @@ -7208,7 +9043,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetJobAttemptLogsRequest); i { + switch v := v.(*CIMetricsAttemptSummary); i { case 0: return &v.state case 1: @@ -7220,7 +9055,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetJobAttemptLogsResponse); i { + switch v := v.(*CIMetricsRunContext); i { case 0: return &v.state case 1: @@ -7232,7 +9067,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StreamJobAttemptLogsRequest); i { + switch v := v.(*CIMetricsWorkflowContext); i { case 0: return &v.state case 1: @@ -7244,7 +9079,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StreamJobAttemptLogsResponse); i { + switch v := v.(*CIMetricsJobContext); i { case 0: return &v.state case 1: @@ -7256,7 +9091,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExportJobAttemptLogsRequest); i { + switch v := v.(*CIMetricsAttemptContext); i { case 0: return &v.state case 1: @@ -7268,7 +9103,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JobAttemptLogExportMetadata); i { + switch v := v.(*CIMetricSample); i { case 0: return &v.state case 1: @@ -7280,7 +9115,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExportJobAttemptLogsResponse); i { + switch v := v.(*CIMetricsStats); i { case 0: return &v.state case 1: @@ -7292,7 +9127,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LogLine); i { + switch v := v.(*CIMetricsAvailability); i { case 0: return &v.state case 1: @@ -7304,7 +9139,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListRunsRequest); i { + switch v := v.(*CIMetricsCapMetadata); i { case 0: return &v.state case 1: @@ -7316,7 +9151,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListRunsResponse); i { + switch v := v.(*GetJobSummaryRequest); i { case 0: return &v.state case 1: @@ -7328,7 +9163,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListRunsResponseRun); i { + switch v := v.(*GetJobSummaryResponse); i { case 0: return &v.state case 1: @@ -7340,7 +9175,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkflowsRequest); i { + switch v := v.(*GetJobAttemptLogsRequest); i { case 0: return &v.state case 1: @@ -7352,7 +9187,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkflowsResponse); i { + switch v := v.(*GetJobAttemptLogsResponse); i { case 0: return &v.state case 1: @@ -7364,7 +9199,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkflowsResponseWorkflow); i { + switch v := v.(*StreamJobAttemptLogsRequest); i { case 0: return &v.state case 1: @@ -7376,6 +9211,138 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StreamJobAttemptLogsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_depot_ci_v1_ci_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ExportJobAttemptLogsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_depot_ci_v1_ci_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*JobAttemptLogExportMetadata); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_depot_ci_v1_ci_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ExportJobAttemptLogsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_depot_ci_v1_ci_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LogLine); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_depot_ci_v1_ci_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListRunsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_depot_ci_v1_ci_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListRunsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_depot_ci_v1_ci_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListRunsResponseRun); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_depot_ci_v1_ci_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkflowsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_depot_ci_v1_ci_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkflowsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_depot_ci_v1_ci_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkflowsResponseWorkflow); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_depot_ci_v1_ci_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListWorkflowsResponseJobCounts); i { case 0: return &v.state @@ -7393,9 +9360,9 @@ func file_depot_ci_v1_ci_proto_init() { (*ImportSecretsAndVarsResponse_RunResult)(nil), } file_depot_ci_v1_ci_proto_msgTypes[7].OneofWrappers = []interface{}{} - file_depot_ci_v1_ci_proto_msgTypes[49].OneofWrappers = []interface{}{} - file_depot_ci_v1_ci_proto_msgTypes[50].OneofWrappers = []interface{}{} - file_depot_ci_v1_ci_proto_msgTypes[61].OneofWrappers = []interface{}{ + file_depot_ci_v1_ci_proto_msgTypes[60].OneofWrappers = []interface{}{} + file_depot_ci_v1_ci_proto_msgTypes[61].OneofWrappers = []interface{}{} + file_depot_ci_v1_ci_proto_msgTypes[72].OneofWrappers = []interface{}{ (*ExportJobAttemptLogsResponse_Metadata)(nil), (*ExportJobAttemptLogsResponse_Chunk)(nil), } @@ -7404,8 +9371,8 @@ func file_depot_ci_v1_ci_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_depot_ci_v1_ci_proto_rawDesc, - NumEnums: 2, - NumMessages: 71, + NumEnums: 5, + NumMessages: 82, NumExtensions: 0, NumServices: 2, }, diff --git a/pkg/proto/depot/ci/v1/civ1connect/ci.connect.go b/pkg/proto/depot/ci/v1/civ1connect/ci.connect.go index 5f51c63c..96084347 100644 --- a/pkg/proto/depot/ci/v1/civ1connect/ci.connect.go +++ b/pkg/proto/depot/ci/v1/civ1connect/ci.connect.go @@ -60,6 +60,9 @@ const ( CIServiceGetRunStatusProcedure = "/depot.ci.v1.CIService/GetRunStatus" // CIServiceGetWorkflowProcedure is the fully-qualified name of the CIService's GetWorkflow RPC. CIServiceGetWorkflowProcedure = "/depot.ci.v1.CIService/GetWorkflow" + // CIServiceGetFailureDiagnosisProcedure is the fully-qualified name of the CIService's + // GetFailureDiagnosis RPC. + CIServiceGetFailureDiagnosisProcedure = "/depot.ci.v1.CIService/GetFailureDiagnosis" // CIServiceGetJobAttemptMetricsProcedure is the fully-qualified name of the CIService's // GetJobAttemptMetrics RPC. CIServiceGetJobAttemptMetricsProcedure = "/depot.ci.v1.CIService/GetJobAttemptMetrics" @@ -114,6 +117,8 @@ type CIServiceClient interface { GetRunStatus(context.Context, *connect.Request[v1.GetRunStatusRequest]) (*connect.Response[v1.GetRunStatusResponse], error) // GetWorkflow returns curated workflow, run, execution, job, and attempt metadata for single-workflow inspection GetWorkflow(context.Context, *connect.Request[v1.GetWorkflowRequest]) (*connect.Response[v1.GetWorkflowResponse], error) + // GetFailureDiagnosis returns a bounded deterministic failure diagnosis for a run, workflow, job, or attempt. + GetFailureDiagnosis(context.Context, *connect.Request[v1.GetFailureDiagnosisRequest]) (*connect.Response[v1.FailureDiagnosis], error) // GetJobAttemptMetrics returns CPU and memory metrics for one concrete job attempt GetJobAttemptMetrics(context.Context, *connect.Request[v1.GetJobAttemptMetricsRequest]) (*connect.Response[v1.GetJobAttemptMetricsResponse], error) // GetJobMetrics returns per-attempt CPU and memory metric summaries for one job @@ -214,6 +219,11 @@ func NewCIServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...c baseURL+CIServiceGetWorkflowProcedure, opts..., ), + getFailureDiagnosis: connect.NewClient[v1.GetFailureDiagnosisRequest, v1.FailureDiagnosis]( + httpClient, + baseURL+CIServiceGetFailureDiagnosisProcedure, + opts..., + ), getJobAttemptMetrics: connect.NewClient[v1.GetJobAttemptMetricsRequest, v1.GetJobAttemptMetricsResponse]( httpClient, baseURL+CIServiceGetJobAttemptMetricsProcedure, @@ -275,6 +285,7 @@ type cIServiceClient struct { cancelRun *connect.Client[v1.CancelRunRequest, v1.CancelRunResponse] getRunStatus *connect.Client[v1.GetRunStatusRequest, v1.GetRunStatusResponse] getWorkflow *connect.Client[v1.GetWorkflowRequest, v1.GetWorkflowResponse] + getFailureDiagnosis *connect.Client[v1.GetFailureDiagnosisRequest, v1.FailureDiagnosis] getJobAttemptMetrics *connect.Client[v1.GetJobAttemptMetricsRequest, v1.GetJobAttemptMetricsResponse] getJobMetrics *connect.Client[v1.GetJobMetricsRequest, v1.GetJobMetricsResponse] getRunMetrics *connect.Client[v1.GetRunMetricsRequest, v1.GetRunMetricsResponse] @@ -341,6 +352,11 @@ func (c *cIServiceClient) GetWorkflow(ctx context.Context, req *connect.Request[ return c.getWorkflow.CallUnary(ctx, req) } +// GetFailureDiagnosis calls depot.ci.v1.CIService.GetFailureDiagnosis. +func (c *cIServiceClient) GetFailureDiagnosis(ctx context.Context, req *connect.Request[v1.GetFailureDiagnosisRequest]) (*connect.Response[v1.FailureDiagnosis], error) { + return c.getFailureDiagnosis.CallUnary(ctx, req) +} + // GetJobAttemptMetrics calls depot.ci.v1.CIService.GetJobAttemptMetrics. func (c *cIServiceClient) GetJobAttemptMetrics(ctx context.Context, req *connect.Request[v1.GetJobAttemptMetricsRequest]) (*connect.Response[v1.GetJobAttemptMetricsResponse], error) { return c.getJobAttemptMetrics.CallUnary(ctx, req) @@ -410,6 +426,8 @@ type CIServiceHandler interface { GetRunStatus(context.Context, *connect.Request[v1.GetRunStatusRequest]) (*connect.Response[v1.GetRunStatusResponse], error) // GetWorkflow returns curated workflow, run, execution, job, and attempt metadata for single-workflow inspection GetWorkflow(context.Context, *connect.Request[v1.GetWorkflowRequest]) (*connect.Response[v1.GetWorkflowResponse], error) + // GetFailureDiagnosis returns a bounded deterministic failure diagnosis for a run, workflow, job, or attempt. + GetFailureDiagnosis(context.Context, *connect.Request[v1.GetFailureDiagnosisRequest]) (*connect.Response[v1.FailureDiagnosis], error) // GetJobAttemptMetrics returns CPU and memory metrics for one concrete job attempt GetJobAttemptMetrics(context.Context, *connect.Request[v1.GetJobAttemptMetricsRequest]) (*connect.Response[v1.GetJobAttemptMetricsResponse], error) // GetJobMetrics returns per-attempt CPU and memory metric summaries for one job @@ -506,6 +524,11 @@ func NewCIServiceHandler(svc CIServiceHandler, opts ...connect.HandlerOption) (s svc.GetWorkflow, opts..., ) + cIServiceGetFailureDiagnosisHandler := connect.NewUnaryHandler( + CIServiceGetFailureDiagnosisProcedure, + svc.GetFailureDiagnosis, + opts..., + ) cIServiceGetJobAttemptMetricsHandler := connect.NewUnaryHandler( CIServiceGetJobAttemptMetricsProcedure, svc.GetJobAttemptMetrics, @@ -575,6 +598,8 @@ func NewCIServiceHandler(svc CIServiceHandler, opts ...connect.HandlerOption) (s cIServiceGetRunStatusHandler.ServeHTTP(w, r) case CIServiceGetWorkflowProcedure: cIServiceGetWorkflowHandler.ServeHTTP(w, r) + case CIServiceGetFailureDiagnosisProcedure: + cIServiceGetFailureDiagnosisHandler.ServeHTTP(w, r) case CIServiceGetJobAttemptMetricsProcedure: cIServiceGetJobAttemptMetricsHandler.ServeHTTP(w, r) case CIServiceGetJobMetricsProcedure: @@ -646,6 +671,10 @@ func (UnimplementedCIServiceHandler) GetWorkflow(context.Context, *connect.Reque return nil, connect.NewError(connect.CodeUnimplemented, errors.New("depot.ci.v1.CIService.GetWorkflow is not implemented")) } +func (UnimplementedCIServiceHandler) GetFailureDiagnosis(context.Context, *connect.Request[v1.GetFailureDiagnosisRequest]) (*connect.Response[v1.FailureDiagnosis], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("depot.ci.v1.CIService.GetFailureDiagnosis is not implemented")) +} + func (UnimplementedCIServiceHandler) GetJobAttemptMetrics(context.Context, *connect.Request[v1.GetJobAttemptMetricsRequest]) (*connect.Response[v1.GetJobAttemptMetricsResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("depot.ci.v1.CIService.GetJobAttemptMetrics is not implemented")) } diff --git a/proto/depot/ci/v1/ci.proto b/proto/depot/ci/v1/ci.proto index faa923e6..dfba277c 100644 --- a/proto/depot/ci/v1/ci.proto +++ b/proto/depot/ci/v1/ci.proto @@ -38,6 +38,9 @@ service CIService { // GetWorkflow returns curated workflow, run, execution, job, and attempt metadata for single-workflow inspection rpc GetWorkflow(GetWorkflowRequest) returns (GetWorkflowResponse) {} + // GetFailureDiagnosis returns a bounded deterministic failure diagnosis for a run, workflow, job, or attempt. + rpc GetFailureDiagnosis(GetFailureDiagnosisRequest) returns (FailureDiagnosis) {} + // GetJobAttemptMetrics returns CPU and memory metrics for one concrete job attempt rpc GetJobAttemptMetrics(GetJobAttemptMetricsRequest) returns (GetJobAttemptMetricsResponse) {} @@ -411,6 +414,171 @@ message GetWorkflowJobAttempt { string finished_at = 7; } +// Failure diagnosis messages + +enum FailureDiagnosisTargetType { + FAILURE_DIAGNOSIS_TARGET_TYPE_UNSPECIFIED = 0; + FAILURE_DIAGNOSIS_TARGET_TYPE_RUN = 1; + FAILURE_DIAGNOSIS_TARGET_TYPE_WORKFLOW = 2; + FAILURE_DIAGNOSIS_TARGET_TYPE_JOB = 3; + FAILURE_DIAGNOSIS_TARGET_TYPE_ATTEMPT = 4; +} + +enum FailureDiagnosisState { + FAILURE_DIAGNOSIS_STATE_UNSPECIFIED = 0; + FAILURE_DIAGNOSIS_STATE_EMPTY = 1; + FAILURE_DIAGNOSIS_STATE_GROUPED_FAILURES = 2; + FAILURE_DIAGNOSIS_STATE_FOCUSED_FAILURE = 3; + FAILURE_DIAGNOSIS_STATE_OVER_LIMIT = 4; +} + +enum DrillDownCommandKind { + DRILL_DOWN_COMMAND_KIND_UNSPECIFIED = 0; + DRILL_DOWN_COMMAND_KIND_LOGS = 1; + DRILL_DOWN_COMMAND_KIND_SUMMARY = 2; + DRILL_DOWN_COMMAND_KIND_DIAGNOSE_WORKFLOW = 3; + DRILL_DOWN_COMMAND_KIND_DIAGNOSE_JOB = 4; +} + +message GetFailureDiagnosisRequest { + // target_id identifies a run, workflow, job, or attempt. When target_type is unspecified the server resolves it. + string target_id = 1; + FailureDiagnosisTargetType target_type = 2; +} + +message FailureDiagnosis { + string org_id = 1; + FailureDiagnosisTarget target = 2; + FailureDiagnosisContext context = 3; + FailureDiagnosisState state = 4; + string empty_reason = 5; + repeated FailureGroup failure_groups = 6; + repeated RepresentativeAttempt representative_attempts = 7; + FailureDiagnosisBounds bounds = 8; + repeated DrillDownCommand next_commands = 9; + FailureDiagnosisCommandCapabilities command_capabilities = 10; + repeated FailureDiagnosisBreakdownRow over_limit_breakdown = 11; +} + +message FailureDiagnosisTarget { + string target_id = 1; + FailureDiagnosisTargetType target_type = 2; + string status = 3; +} + +message FailureDiagnosisContext { + string run_id = 1; + string repo = 2; + string ref = 3; + string sha = 4; + string head_sha = 5; + string trigger = 6; + string run_status = 7; + string workflow_id = 8; + string workflow_name = 9; + string workflow_path = 10; + string workflow_status = 11; + string job_id = 12; + string job_key = 13; + string job_display_name = 14; + string job_status = 15; + string job_conclusion = 16; + string attempt_id = 17; + int32 attempt = 18; + string attempt_status = 19; + string attempt_conclusion = 20; + repeated string truncated_context_fields = 21; +} + +message FailureGroup { + string fingerprint = 1; + string source = 2; + uint32 count = 3; + string error_message = 4; + bool error_message_truncated = 5; + uint32 error_message_original_length = 6; + string diagnosis = 7; + string possible_fix = 8; + repeated RepresentativeAttempt representatives = 9; + uint32 omitted_representative_count = 10; +} + +message RepresentativeAttempt { + string run_id = 1; + string workflow_id = 2; + string workflow_name = 3; + string workflow_path = 4; + string job_id = 5; + string job_key = 6; + string job_display_name = 7; + string job_status = 8; + string job_conclusion = 9; + string attempt_id = 10; + int32 attempt = 11; + string attempt_status = 12; + string attempt_conclusion = 13; + string error_message = 14; + bool error_message_truncated = 15; + uint32 error_message_original_length = 16; + string diagnosis = 17; + string possible_fix = 18; + repeated RelevantErrorLine relevant_lines = 19; + repeated DrillDownCommand next_commands = 20; +} + +message RelevantErrorLine { + string step_id = 1; + uint32 line_number = 2; + string content = 3; + bool content_truncated = 4; + uint32 content_original_length = 5; +} + +message FailureDiagnosisBounds { + uint32 failed_problem_candidate_count = 1; + uint32 failed_problem_candidate_cap = 2; + uint32 total_problem_job_count = 3; + uint32 skipped_dependent_count = 4; + uint32 total_failure_group_count = 5; + uint32 omitted_failure_group_count = 6; + uint32 failure_group_limit = 7; + uint32 representatives_per_group_limit = 8; + uint32 recent_attempt_limit = 9; + uint32 total_attempt_count = 10; + uint32 omitted_attempt_count = 11; + uint32 relevant_line_limit = 12; + uint32 error_line_body_char_limit = 13; + uint32 error_message_char_limit = 14; + uint32 context_label_char_limit = 15; + uint32 over_limit_workflow_breakdown_limit = 16; + uint32 over_limit_job_breakdown_limit = 17; + uint32 omitted_workflow_breakdown_count = 18; + uint32 omitted_job_breakdown_count = 19; + bool truncated = 20; +} + +message DrillDownCommand { + DrillDownCommandKind kind = 1; + bool available = 2; + string unavailable_reason = 3; + repeated string argv = 4; + string target_id = 5; + string label = 6; +} + +message FailureDiagnosisCommandCapabilities { + bool summary_command_available = 1; +} + +message FailureDiagnosisBreakdownRow { + FailureDiagnosisTargetType target_type = 1; + string target_id = 2; + string label = 3; + string status = 4; + uint32 failed_problem_candidate_count = 5; + repeated DrillDownCommand next_commands = 6; +} + // CI metrics messages message GetJobAttemptMetricsRequest { From 8ebec37cd04eabef84b120dc3a2b0ca4962eb004 Mon Sep 17 00:00:00 2001 From: Andrew Watkins Date: Fri, 8 May 2026 07:26:17 -0500 Subject: [PATCH 2/3] fix(ci): avoid repeated diagnose commands --- pkg/cmd/ci/diagnose.go | 181 ++++++++++++++++++++++++++++++++---- pkg/cmd/ci/diagnose_test.go | 69 +++++++++++++- 2 files changed, 229 insertions(+), 21 deletions(-) diff --git a/pkg/cmd/ci/diagnose.go b/pkg/cmd/ci/diagnose.go index a4bc2bae..d9d07a00 100644 --- a/pkg/cmd/ci/diagnose.go +++ b/pkg/cmd/ci/diagnose.go @@ -15,6 +15,11 @@ import ( var ciDiagnose = api.CIGetFailureDiagnosis +const ( + diagnoseTextWidth = 96 + maxGroupEvidenceLines = 5 +) + func NewCmdDiagnose() *cobra.Command { var ( orgID string @@ -188,7 +193,7 @@ func printDiagnosisContext(w io.Writer, context *civ1.FailureDiagnosisContext) { if context.GetRef() != "" { fmt.Fprintf(w, " @ %s", context.GetRef()) } - if context.GetSha() != "" { + if context.GetSha() != "" && context.GetSha() != context.GetRef() { fmt.Fprintf(w, " (%s)", context.GetSha()) } fmt.Fprintln(w) @@ -289,7 +294,6 @@ func printFocusedDiagnosis(w io.Writer, resp *civ1.FailureDiagnosis, renderer di printGroupedDiagnosis(w, resp, renderer) return } - printNextCommands(w, renderer.commands(resp.GetNextCommands(), resp.GetCommandCapabilities(), true), "Next commands") printSummaryUnavailableNote(w, resp.GetCommandCapabilities()) printBoundsSummary(w, resp) } @@ -307,27 +311,32 @@ func printGroupedDiagnosis(w io.Writer, resp *civ1.FailureDiagnosis, renderer di fmt.Fprintf(w, "Failure groups: %d\n", len(resp.GetFailureGroups())) } for i, group := range resp.GetFailureGroups() { - fmt.Fprintf(w, "\nGroup %d: %d failure", i+1, group.GetCount()) - if group.GetCount() != 1 { - fmt.Fprint(w, "s") + fmt.Fprintf(w, "\nGroup %d: %s\n", i+1, firstNonEmpty(group.GetErrorMessage(), "failure group")) + fmt.Fprintf(w, " %d %s\n", group.GetCount(), pluralize("failure", int(group.GetCount()))) + if group.GetErrorMessageTruncated() { + fmt.Fprintf(w, " Error truncated%s\n", truncatedSuffix(true, group.GetErrorMessageOriginalLength())) } - if group.GetSource() != "" { - fmt.Fprintf(w, " from %s", group.GetSource()) - } - fmt.Fprintln(w) - if group.GetErrorMessage() != "" { - fmt.Fprintf(w, " Error: %s%s\n", group.GetErrorMessage(), truncatedSuffix(group.GetErrorMessageTruncated(), group.GetErrorMessageOriginalLength())) + representativeError := commonRepresentativeError(group) + showRepresentativeErrors := true + if representativeError != "" && representativeError != group.GetErrorMessage() { + fmt.Fprintf(w, " Where: %s\n", representativeError) + showRepresentativeErrors = false + } else if representativeError == group.GetErrorMessage() { + showRepresentativeErrors = false } if group.GetDiagnosis() != "" { - fmt.Fprintf(w, " Diagnosis: %s\n", group.GetDiagnosis()) + fmt.Fprintln(w) + printWrappedSection(w, "Diagnosis", group.GetDiagnosis(), " ") } if group.GetPossibleFix() != "" { - fmt.Fprintf(w, " Possible fix: %s\n", group.GetPossibleFix()) + fmt.Fprintln(w) + printWrappedSection(w, "Possible fix", group.GetPossibleFix(), " ") } if len(group.GetRepresentatives()) > 0 { - fmt.Fprintln(w, " Representative attempts:") + fmt.Fprintln(w) + fmt.Fprintln(w, " Attempts:") for _, representative := range group.GetRepresentatives() { - printRepresentativeAttempt(w, resp.GetOrgId(), representative, resp.GetCommandCapabilities(), renderer, " ") + printCompactRepresentativeAttempt(w, resp.GetOrgId(), representative, resp.GetCommandCapabilities(), renderer, " ", showRepresentativeErrors) } } if group.GetOmittedRepresentativeCount() > 0 { @@ -338,12 +347,49 @@ func printGroupedDiagnosis(w io.Writer, resp *civ1.FailureDiagnosis, renderer di len(group.GetRepresentatives())+int(group.GetOmittedRepresentativeCount()), ) } + printGroupEvidence(w, group, " ") } - printNextCommands(w, renderer.commands(resp.GetNextCommands(), resp.GetCommandCapabilities(), true), "Next commands") printSummaryUnavailableNote(w, resp.GetCommandCapabilities()) printBoundsSummary(w, resp) } +func printCompactRepresentativeAttempt(w io.Writer, orgID string, representative *civ1.RepresentativeAttempt, capabilities *civ1.FailureDiagnosisCommandCapabilities, renderer diagnosisCommandRenderer, indent string, showError bool) { + fmt.Fprintf(w, "%s- #%d %s", indent, representative.GetAttempt(), representative.GetAttemptId()) + if representative.GetJobKey() != "" || representative.GetJobDisplayName() != "" { + fmt.Fprintf(w, " %s", firstNonEmpty(representative.GetJobDisplayName(), representative.GetJobKey())) + } + if representative.GetAttemptStatus() != "" { + fmt.Fprintf(w, " (%s)", representative.GetAttemptStatus()) + } + fmt.Fprintln(w) + if showError && representative.GetErrorMessage() != "" { + fmt.Fprintf(w, "%s Error: %s%s\n", indent, representative.GetErrorMessage(), truncatedSuffix(representative.GetErrorMessageTruncated(), representative.GetErrorMessageOriginalLength())) + } + for _, command := range renderer.commands(representative.GetNextCommands(), capabilities, true) { + fmt.Fprintf(w, "%s %s: %s\n", indent, firstNonEmpty(command.Label, "Command"), command.Command) + } + if orgID != "" && representative.GetWorkflowId() != "" && representative.GetJobId() != "" && representative.GetAttemptId() != "" { + fmt.Fprintf(w, "%s View: %s\n", indent, statusAttemptViewURL(orgID, representative.GetWorkflowId(), representative.GetJobId(), representative.GetAttemptId())) + } +} + +func commonRepresentativeError(group *civ1.FailureGroup) string { + var common string + for _, representative := range group.GetRepresentatives() { + if representative.GetErrorMessage() == "" { + continue + } + if common == "" { + common = representative.GetErrorMessage() + continue + } + if representative.GetErrorMessage() != common { + return "" + } + } + return common +} + func printRepresentativeAttempt(w io.Writer, orgID string, representative *civ1.RepresentativeAttempt, capabilities *civ1.FailureDiagnosisCommandCapabilities, renderer diagnosisCommandRenderer, indent string) { fmt.Fprintf(w, "%sAttempt #%d %s", indent, representative.GetAttempt(), representative.GetAttemptId()) if representative.GetJobKey() != "" || representative.GetJobDisplayName() != "" { @@ -380,6 +426,66 @@ func printRepresentativeAttempt(w io.Writer, orgID string, representative *civ1. } } +func printGroupEvidence(w io.Writer, group *civ1.FailureGroup, indent string) { + type evidenceLine struct { + prefix string + content string + truncated bool + originalLength uint32 + } + + seen := map[string]struct{}{} + lines := make([]evidenceLine, 0, maxGroupEvidenceLines) + for _, representative := range group.GetRepresentatives() { + for _, line := range representative.GetRelevantLines() { + if isGenericEvidenceLine(line.GetContent()) { + continue + } + prefix := fmt.Sprintf("%d", line.GetLineNumber()) + if line.GetStepId() != "" { + prefix = line.GetStepId() + ":" + prefix + } + key := normalizeEvidenceContent(line.GetContent()) + if _, ok := seen[key]; ok { + continue + } + seen[key] = struct{}{} + lines = append(lines, evidenceLine{ + prefix: prefix, + content: line.GetContent(), + truncated: line.GetContentTruncated(), + originalLength: line.GetContentOriginalLength(), + }) + if len(lines) == maxGroupEvidenceLines { + break + } + } + if len(lines) == maxGroupEvidenceLines { + break + } + } + if len(lines) == 0 { + return + } + + fmt.Fprintln(w) + fmt.Fprintf(w, "%sEvidence:\n", indent) + for _, line := range lines { + fmt.Fprintf(w, "%s - %s: %s%s\n", indent, line.prefix, line.content, truncatedSuffix(line.truncated, line.originalLength)) + } +} + +func normalizeEvidenceContent(content string) string { + return strings.Join(strings.Fields(content), " ") +} + +func isGenericEvidenceLine(content string) bool { + normalized := strings.ToLower(normalizeEvidenceContent(content)) + return strings.HasPrefix(normalized, "##[error]script exited with code ") || + strings.Contains(normalized, "err_pnpm_recursive_run_first_fail") || + strings.Contains(normalized, "elifecycle command failed") +} + func printNextCommands(w io.Writer, commands []diagnoseCommandJSON, title string) { if len(commands) == 0 { return @@ -431,6 +537,49 @@ func truncatedSuffix(truncated bool, originalLength uint32) string { return fmt.Sprintf(" (truncated from %d chars)", originalLength) } +func printWrappedSection(w io.Writer, title, text, indent string) { + fmt.Fprintf(w, "%s%s:\n", indent, title) + printWrappedText(w, text, indent+" ", diagnoseTextWidth) +} + +func printWrappedText(w io.Writer, text, indent string, width int) { + available := width - len(indent) + if available < 20 { + available = 20 + } + for _, paragraph := range strings.Split(text, "\n") { + words := strings.Fields(paragraph) + if len(words) == 0 { + fmt.Fprintln(w, indent) + continue + } + + line := "" + for _, word := range words { + if line == "" { + line = word + continue + } + if len(line)+1+len(word) > available { + fmt.Fprintln(w, indent+line) + line = word + continue + } + line += " " + word + } + if line != "" { + fmt.Fprintln(w, indent+line) + } + } +} + +func pluralize(singular string, count int) string { + if count == 1 { + return singular + } + return singular + "s" +} + type diagnoseJSONDocument struct { OrgID string `json:"org_id"` State string `json:"state"` diff --git a/pkg/cmd/ci/diagnose_test.go b/pkg/cmd/ci/diagnose_test.go index ae1259c4..f9f69b2a 100644 --- a/pkg/cmd/ci/diagnose_test.go +++ b/pkg/cmd/ci/diagnose_test.go @@ -49,11 +49,13 @@ func TestDiagnoseHumanGroupedOutputWithOrgQualifiedCommands(t *testing.T) { "Target: run run-1 (failed)", "Source: depot/cli @ refs/heads/main (abc123)", "Failure groups: 2 (1 omitted)", - "Group 1: 3 failures from attempt_error", - "Error: go test ./... failed", - "Diagnosis: Unit tests failed in package pkg/cmd/ci.", - "Possible fix: Fix the failing assertion and rerun tests.", - "Attempt #2 att-1 for ci.yml:test (failed)", + "Group 1: go test ./... failed", + "3 failures", + "Diagnosis:\n Unit tests failed in package pkg/cmd/ci.", + "Possible fix:\n Fix the failing assertion and rerun tests.", + "Attempts:", + "- #2 att-1 ci.yml:test (failed)", + "Evidence:", "build:42: expected true, got false", "Logs: depot ci logs att-1 --org org-123", "Summary: depot ci summary att-1 --org org-123", @@ -66,6 +68,15 @@ func TestDiagnoseHumanGroupedOutputWithOrgQualifiedCommands(t *testing.T) { t.Fatalf("diagnose output missing %q:\n%s", want, stdout) } } + if count := strings.Count(stdout, "Unit tests failed in package pkg/cmd/ci."); count != 1 { + t.Fatalf("diagnosis rendered %d times, want group-level only:\n%s", count, stdout) + } + if count := strings.Count(stdout, "Fix the failing assertion and rerun tests."); count != 1 { + t.Fatalf("possible fix rendered %d times, want group-level only:\n%s", count, stdout) + } + if count := strings.Count(stdout, "go test ./... failed"); count != 1 { + t.Fatalf("group error rendered %d times, want group heading only:\n%s", count, stdout) + } } func TestDiagnoseRepresentativeSamplingDoesNotPrintGenericTruncationFooter(t *testing.T) { @@ -128,6 +139,54 @@ func TestDiagnoseRepresentativeSamplingStillPrintsRealTruncationFooter(t *testin } } +func TestDiagnoseGroupedOutputDoesNotRepeatRepresentativeCommandsFooter(t *testing.T) { + restoreDiagnoseAPI(t) + + ciDiagnose = func(ctx context.Context, token, orgID string, req *civ1.GetFailureDiagnosisRequest) (*civ1.FailureDiagnosis, error) { + resp := groupedDiagnosisResponse(true) + resp.NextCommands = []*civ1.DrillDownCommand{logsCommand("att-1"), summaryCommand("att-1")} + return resp, nil + } + + stdout, _, err := executeDiagnoseTextCommand([]string{"--org", "org-123", "--token", "token-123", "run-1"}) + if err != nil { + t.Fatal(err) + } + if strings.Contains(stdout, "Next commands:") { + t.Fatalf("grouped output repeated representative commands in footer:\n%s", stdout) + } + if count := strings.Count(stdout, "depot ci logs att-1 --org org-123"); count != 1 { + t.Fatalf("logs command rendered %d times, want once:\n%s", count, stdout) + } + if count := strings.Count(stdout, "depot ci summary att-1 --org org-123"); count != 1 { + t.Fatalf("summary command rendered %d times, want once:\n%s", count, stdout) + } +} + +func TestDiagnoseFocusedOutputDoesNotRepeatRepresentativeCommandsFooter(t *testing.T) { + restoreDiagnoseAPI(t) + + ciDiagnose = func(ctx context.Context, token, orgID string, req *civ1.GetFailureDiagnosisRequest) (*civ1.FailureDiagnosis, error) { + resp := focusedDiagnosisResponse(true) + resp.NextCommands = []*civ1.DrillDownCommand{logsCommand("att-1"), summaryCommand("att-1")} + return resp, nil + } + + stdout, _, err := executeDiagnoseTextCommand([]string{"--org", "org-123", "--token", "token-123", "--type", "attempt", "att-1"}) + if err != nil { + t.Fatal(err) + } + if strings.Contains(stdout, "Next commands:") { + t.Fatalf("focused output repeated representative commands in footer:\n%s", stdout) + } + if count := strings.Count(stdout, "depot ci logs att-1 --org org-123"); count != 1 { + t.Fatalf("logs command rendered %d times, want once:\n%s", count, stdout) + } + if count := strings.Count(stdout, "depot ci summary att-1 --org org-123"); count != 1 { + t.Fatalf("summary command rendered %d times, want once:\n%s", count, stdout) + } +} + func TestDiagnoseJSONOutputIsCLINormalized(t *testing.T) { restoreDiagnoseAPI(t) From e6c1cadaf606d9ccef2466bc3cb37a2199f46401 Mon Sep 17 00:00:00 2001 From: Andrew Watkins Date: Fri, 8 May 2026 12:29:16 -0500 Subject: [PATCH 3/3] fix(ci): avoid duplicate focused diagnosis output --- pkg/cmd/ci/diagnose.go | 15 +++---- pkg/cmd/ci/diagnose_test.go | 79 +++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 10 deletions(-) diff --git a/pkg/cmd/ci/diagnose.go b/pkg/cmd/ci/diagnose.go index d9d07a00..4a49b07b 100644 --- a/pkg/cmd/ci/diagnose.go +++ b/pkg/cmd/ci/diagnose.go @@ -278,21 +278,16 @@ func printOverLimitDiagnosis(w io.Writer, resp *civ1.FailureDiagnosis, renderer func printFocusedDiagnosis(w io.Writer, resp *civ1.FailureDiagnosis, renderer diagnosisCommandRenderer) { fmt.Fprintln(w) - if len(resp.GetRepresentativeAttempts()) == 0 && len(resp.GetFailureGroups()) == 0 { + if len(resp.GetRepresentativeAttempts()) == 0 { fmt.Fprintln(w, "Focused diagnosis returned no representative attempts.") printNextCommands(w, renderer.commands(resp.GetNextCommands(), resp.GetCommandCapabilities(), true), "Next commands") printBoundsSummary(w, resp) return } - if len(resp.GetRepresentativeAttempts()) > 0 { - fmt.Fprintln(w, "Focused diagnosis:") - for _, representative := range resp.GetRepresentativeAttempts() { - printRepresentativeAttempt(w, resp.GetOrgId(), representative, resp.GetCommandCapabilities(), renderer, " ") - } - } - if len(resp.GetFailureGroups()) > 0 { - printGroupedDiagnosis(w, resp, renderer) - return + + fmt.Fprintln(w, "Focused diagnosis:") + for _, representative := range resp.GetRepresentativeAttempts() { + printRepresentativeAttempt(w, resp.GetOrgId(), representative, resp.GetCommandCapabilities(), renderer, " ") } printSummaryUnavailableNote(w, resp.GetCommandCapabilities()) printBoundsSummary(w, resp) diff --git a/pkg/cmd/ci/diagnose_test.go b/pkg/cmd/ci/diagnose_test.go index f9f69b2a..62a7a358 100644 --- a/pkg/cmd/ci/diagnose_test.go +++ b/pkg/cmd/ci/diagnose_test.go @@ -187,6 +187,31 @@ func TestDiagnoseFocusedOutputDoesNotRepeatRepresentativeCommandsFooter(t *testi } } +func TestDiagnoseFocusedTextIgnoresFailureGroups(t *testing.T) { + restoreDiagnoseAPI(t) + + ciDiagnose = func(ctx context.Context, token, orgID string, req *civ1.GetFailureDiagnosisRequest) (*civ1.FailureDiagnosis, error) { + return focusedDiagnosisResponseWithGroup(true), nil + } + + stdout, _, err := executeDiagnoseTextCommand([]string{"--org", "org-123", "--token", "token-123", "--type", "attempt", "att-1"}) + if err != nil { + t.Fatal(err) + } + if !strings.Contains(stdout, "Focused diagnosis:") { + t.Fatalf("focused output missing focused diagnosis:\n%s", stdout) + } + if strings.Contains(stdout, "Failure groups:") || strings.Contains(stdout, "Group 1:") { + t.Fatalf("focused output rendered failure groups:\n%s", stdout) + } + if count := strings.Count(stdout, "Unit tests failed in package pkg/cmd/ci."); count != 1 { + t.Fatalf("focused diagnosis rendered %d times, want once:\n%s", count, stdout) + } + if strings.Contains(stdout, "group-level diagnosis should stay JSON-only") { + t.Fatalf("focused text output leaked group diagnosis:\n%s", stdout) + } +} + func TestDiagnoseJSONOutputIsCLINormalized(t *testing.T) { restoreDiagnoseAPI(t) @@ -238,6 +263,41 @@ func TestDiagnoseJSONOutputIsCLINormalized(t *testing.T) { } } +func TestDiagnoseFocusedJSONKeepsFailureGroups(t *testing.T) { + restoreDiagnoseAPI(t) + + ciDiagnose = func(ctx context.Context, token, orgID string, req *civ1.GetFailureDiagnosisRequest) (*civ1.FailureDiagnosis, error) { + return focusedDiagnosisResponseWithGroup(true), nil + } + + cmd := NewCmdDiagnose() + cmd.SetArgs([]string{"--org", "org-123", "--token", "token-123", "--type", "attempt", "--output", "json", "att-1"}) + cmd.SetOut(io.Discard) + cmd.SetErr(io.Discard) + + stdout, err := captureStdout(t, cmd.Execute) + if err != nil { + t.Fatal(err) + } + + var got diagnoseJSONDocument + if err := json.Unmarshal([]byte(stdout), &got); err != nil { + t.Fatalf("invalid JSON output: %v\n%s", err, stdout) + } + if got.State != "focused_failure" { + t.Fatalf("state = %q, want focused_failure", got.State) + } + if len(got.RepresentativeAttempts) != 1 { + t.Fatalf("representative_attempts = %+v, want one", got.RepresentativeAttempts) + } + if len(got.FailureGroups) != 1 { + t.Fatalf("failure_groups = %+v, want API groups preserved in JSON", got.FailureGroups) + } + if got.FailureGroups[0].Diagnosis != "group-level diagnosis should stay JSON-only" { + t.Fatalf("failure group diagnosis = %q", got.FailureGroups[0].Diagnosis) + } +} + func TestDiagnoseOmitsSummaryCommandsWhenUnavailable(t *testing.T) { restoreDiagnoseAPI(t) @@ -518,6 +578,25 @@ func focusedDiagnosisResponse(summaryAvailable bool) *civ1.FailureDiagnosis { } } +func focusedDiagnosisResponseWithGroup(summaryAvailable bool) *civ1.FailureDiagnosis { + resp := focusedDiagnosisResponse(summaryAvailable) + resp.FailureGroups = []*civ1.FailureGroup{ + { + Fingerprint: "attempt_error:go-test", + Source: "attempt_error", + Count: 1, + ErrorMessage: "go test ./... failed", + Diagnosis: "group-level diagnosis should stay JSON-only", + PossibleFix: "group-level fix should stay JSON-only", + Representatives: []*civ1.RepresentativeAttempt{ + diagnoseRepresentative(summaryAvailable), + }, + }, + } + resp.Bounds.TotalFailureGroupCount = 1 + return resp +} + func diagnoseRepresentative(summaryAvailable bool) *civ1.RepresentativeAttempt { commands := []*civ1.DrillDownCommand{logsCommand("att-1")} if summaryAvailable {